Change-Id: I4e9e31488f91465df6b2c6800a3940118107524b Reviewed-on: https://cl.tvl.fyi/c/depot/+/5315 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su> Autosubmit: tazjin <tazjin@tvl.su>
		
			
				
	
	
		
			88 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| yants
 | |
| =====
 | |
| 
 | |
| This is a tiny type-checker for data in Nix, written in Nix.
 | |
| 
 | |
| # Features
 | |
| 
 | |
| * Checking of primitive types (`int`, `string` etc.)
 | |
| * Checking polymorphic types (`option`, `list`, `either`)
 | |
| * Defining & checking struct/record types
 | |
| * Defining & matching enum types
 | |
| * Defining & matching sum types
 | |
| * Defining function signatures (including curried functions)
 | |
| * Types are composable! `option string`! `list (either int (option float))`!
 | |
| * Type errors also compose!
 | |
| 
 | |
| Currently lacking:
 | |
| 
 | |
| * Any kind of inference
 | |
| * Convenient syntax for attribute-set function signatures
 | |
| 
 | |
| ## Primitives & simple polymorphism
 | |
| 
 | |
| 
 | |
| 
 | |
| ## Structs
 | |
| 
 | |
| 
 | |
| 
 | |
| ## Nested structs!
 | |
| 
 | |
| 
 | |
| 
 | |
| ## Enums!
 | |
| 
 | |
| 
 | |
| 
 | |
| ## Functions!
 | |
| 
 | |
| 
 | |
| 
 | |
| # Usage
 | |
| 
 | |
| Yants can be imported from its `default.nix`. A single attribute (`lib`) can be
 | |
| passed, which will otherwise be imported from `<nixpkgs>`.
 | |
| 
 | |
| TIP: You do not need to clone the entire TVL repository to use Yants!
 | |
| You can clone just this project through josh: `git clone
 | |
| https://code.tvl.fyi/depot.git:/nix/yants.git`
 | |
| 
 | |
| Examples for the most common import methods would be:
 | |
| 
 | |
| 1. Import into scope with `with`:
 | |
|     ```nix
 | |
|     with (import ./default.nix {});
 | |
|     # ... Nix code that uses yants ...
 | |
|     ```
 | |
| 
 | |
| 2. Import as a named variable:
 | |
|     ```nix
 | |
|     let yants = import ./default.nix {};
 | |
|     in yants.string "foo" # or other uses ...
 | |
|     ````
 | |
| 
 | |
| 3. Overlay into `pkgs.lib`:
 | |
|     ```nix
 | |
|     # wherever you import your package set (e.g. from <nixpkgs>):
 | |
|     import <nixpkgs> {
 | |
|       overlays = [
 | |
|         (self: super: {
 | |
|           lib = super.lib // { yants = import ./default.nix { inherit (super) lib; }; };
 | |
|         })
 | |
|       ];
 | |
|     }
 | |
| 
 | |
|     # yants now lives at lib.yants, besides the other library functions!
 | |
|     ```
 | |
| 
 | |
| Please see my [Nix one-pager](https://github.com/tazjin/nix-1p) for more generic
 | |
| information about the Nix language and what the above constructs mean.
 | |
| 
 | |
| # Stability
 | |
| 
 | |
| The current API of Yants is **not yet** considered stable, but it works fine and
 | |
| should continue to do so even if used at an older version.
 | |
| 
 | |
| Yants' tests use Nix versions above 2.2 - compatibility with older versions is
 | |
| not guaranteed.
 |