mirror of
				https://github.com/NotAShelf/nvf.git
				synced 2025-10-31 11:02:37 +00:00 
			
		
		
		
	refactor: move lib out of modules
This commit is contained in:
		
					parent
					
						
							
								206e17bbe4
							
						
					
				
			
			
				commit
				
					
						89be2b9d37
					
				
			
		
					 8 changed files with 334 additions and 0 deletions
				
			
		
							
								
								
									
										9
									
								
								lib/booleans.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								lib/booleans.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| # From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/booleans.nix | ||||
| {lib}: { | ||||
|   # Converts a boolean to a yes/no string. This is used in lots of | ||||
|   # configuration formats. | ||||
|   yesNo = value: | ||||
|     if value | ||||
|     then "yes" | ||||
|     else "no"; | ||||
| } | ||||
							
								
								
									
										107
									
								
								lib/dag.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								lib/dag.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,107 @@ | |||
| # From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/dag.nix | ||||
| # A generalization of Nixpkgs's `strings-with-deps.nix`. | ||||
| # | ||||
| # The main differences from the Nixpkgs version are | ||||
| # | ||||
| #  - not specific to strings, i.e., any payload is OK, | ||||
| # | ||||
| #  - the addition of the function `entryBefore` indicating a "wanted | ||||
| #    by" relationship. | ||||
| {lib}: let | ||||
|   inherit (lib) all filterAttrs nvim mapAttrs toposort; | ||||
| in { | ||||
|   empty = {}; | ||||
| 
 | ||||
|   isEntry = e: e ? data && e ? after && e ? before; | ||||
|   isDag = dag: | ||||
|     builtins.isAttrs dag && all nvim.dag.isEntry (builtins.attrValues dag); | ||||
| 
 | ||||
|   /* | ||||
|   Takes an attribute set containing entries built by entryAnywhere, | ||||
|   entryAfter, and entryBefore to a topologically sorted list of | ||||
|   entries. | ||||
| 
 | ||||
|   Internally this function uses the `toposort` function in | ||||
|   `<nixpkgs/lib/lists.nix>` and its value is accordingly. | ||||
| 
 | ||||
|   Specifically, the result on success is | ||||
| 
 | ||||
|      { result = [ { name = ?; data = ?; } … ] } | ||||
| 
 | ||||
|   For example | ||||
| 
 | ||||
|      nix-repl> topoSort { | ||||
|                  a = entryAnywhere "1"; | ||||
|                  b = entryAfter [ "a" "c" ] "2"; | ||||
|                  c = entryBefore [ "d" ] "3"; | ||||
|                  d = entryBefore [ "e" ] "4"; | ||||
|                  e = entryAnywhere "5"; | ||||
|                } == { | ||||
|                  result = [ | ||||
|                    { data = "1"; name = "a"; } | ||||
|                    { data = "3"; name = "c"; } | ||||
|                    { data = "2"; name = "b"; } | ||||
|                    { data = "4"; name = "d"; } | ||||
|                    { data = "5"; name = "e"; } | ||||
|                  ]; | ||||
|                } | ||||
|      true | ||||
| 
 | ||||
|   And the result on error is | ||||
| 
 | ||||
|      { | ||||
|        cycle = [ { after = ?; name = ?; data = ? } … ]; | ||||
|        loops = [ { after = ?; name = ?; data = ? } … ]; | ||||
|      } | ||||
| 
 | ||||
|   For example | ||||
| 
 | ||||
|      nix-repl> topoSort { | ||||
|                  a = entryAnywhere "1"; | ||||
|                  b = entryAfter [ "a" "c" ] "2"; | ||||
|                  c = entryAfter [ "d" ] "3"; | ||||
|                  d = entryAfter [ "b" ] "4"; | ||||
|                  e = entryAnywhere "5"; | ||||
|                } == { | ||||
|                  cycle = [ | ||||
|                    { after = [ "a" "c" ]; data = "2"; name = "b"; } | ||||
|                    { after = [ "d" ]; data = "3"; name = "c"; } | ||||
|                    { after = [ "b" ]; data = "4"; name = "d"; } | ||||
|                  ]; | ||||
|                  loops = [ | ||||
|                    { after = [ "a" "c" ]; data = "2"; name = "b"; } | ||||
|                  ]; | ||||
|                } | ||||
|      true | ||||
|   */ | ||||
|   topoSort = dag: let | ||||
|     dagBefore = dag: name: | ||||
|       builtins.attrNames | ||||
|       (filterAttrs (n: v: builtins.elem name v.before) dag); | ||||
|     normalizedDag = | ||||
|       mapAttrs (n: v: { | ||||
|         name = n; | ||||
|         data = v.data; | ||||
|         after = v.after ++ dagBefore dag n; | ||||
|       }) | ||||
|       dag; | ||||
|     before = a: b: builtins.elem a.name b.after; | ||||
|     sorted = toposort before (builtins.attrValues normalizedDag); | ||||
|   in | ||||
|     if sorted ? result | ||||
|     then { | ||||
|       result = map (v: {inherit (v) name data;}) sorted.result; | ||||
|     } | ||||
|     else sorted; | ||||
| 
 | ||||
|   # Applies a function to each element of the given DAG. | ||||
|   map = f: mapAttrs (n: v: v // {data = f n v.data;}); | ||||
| 
 | ||||
|   entryBetween = before: after: data: {inherit data before after;}; | ||||
| 
 | ||||
|   # Create a DAG entry with no particular dependency information. | ||||
|   entryAnywhere = nvim.dag.entryBetween [] []; | ||||
| 
 | ||||
|   entryAfter = nvim.dag.entryBetween []; | ||||
|   entryBefore = before: nvim.dag.entryBetween before []; | ||||
| } | ||||
							
								
								
									
										5
									
								
								lib/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								lib/default.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| {lib}: { | ||||
|   dag = import ./dag.nix {inherit lib;}; | ||||
|   booleans = import ./booleans.nix {inherit lib;}; | ||||
|   types = import ./types.nix {inherit lib;}; | ||||
| } | ||||
							
								
								
									
										44
									
								
								lib/hm-module.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								lib/hm-module.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | |||
| # Home Manager module | ||||
| { | ||||
|   config, | ||||
|   pkgs, | ||||
|   lib ? pkgs.lib, | ||||
|   ... | ||||
| }: let | ||||
|   cfg = config.programs.neovim-flake; | ||||
|   set = pkgs.neovim-maximal {mainConfig = cfg.settings;}; | ||||
| in | ||||
|   with lib; { | ||||
|     meta.maintainers = [maintainers.notashelf]; | ||||
| 
 | ||||
|     options.programs.neovim-flake = { | ||||
|       enable = mkEnableOption "A NeoVim IDE with a focus on configurability and extensibility."; | ||||
| 
 | ||||
|       settings = mkOption { | ||||
|         type = types.attrsOf types.anything; | ||||
|         default = {}; | ||||
|         example = literalExpression '' | ||||
|           { | ||||
|             vim.viAlias = false; | ||||
|             vim.vimAlias = true; | ||||
|             vim.lsp = { | ||||
|               enable = true; | ||||
|               formatOnSave = true; | ||||
|               lightbulb.enable = true; | ||||
|               lspsaga.enable = false; | ||||
|               nvimCodeActionMenu.enable = true; | ||||
|               trouble.enable = true; | ||||
|               lspSignature.enable = true; | ||||
|               rust.enable = false; | ||||
|               nix = true; | ||||
|             }; | ||||
|           } | ||||
|         ''; | ||||
|         description = "Attribute set of neoflake preferences."; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|     config = mkIf cfg.enable { | ||||
|       home.packages = [set.neovim]; | ||||
|     }; | ||||
|   } | ||||
							
								
								
									
										13
									
								
								lib/stdlib-extended.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								lib/stdlib-extended.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| # From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/stdlib-extended.nix | ||||
| # Just a convenience function that returns the given Nixpkgs standard | ||||
| # library extended with the HM library. | ||||
| nixpkgsLib: let | ||||
|   mkNvimLib = import ./.; | ||||
| in | ||||
|   nixpkgsLib.extend (self: super: { | ||||
|     nvim = mkNvimLib {lib = self;}; | ||||
| 
 | ||||
|     # For forward compatibility. | ||||
|     literalExpression = super.literalExpression or super.literalExample; | ||||
|     literalDocBook = super.literalDocBook or super.literalExample; | ||||
|   }) | ||||
							
								
								
									
										68
									
								
								lib/types-dag.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								lib/types-dag.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,68 @@ | |||
| # From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/types-dag.nix | ||||
| # Used for ordering config text. | ||||
| {lib}: let | ||||
|   inherit | ||||
|     (lib) | ||||
|     defaultFunctor | ||||
|     nvim | ||||
|     mkIf | ||||
|     mkOrder | ||||
|     mkOption | ||||
|     mkOptionType | ||||
|     types | ||||
|     ; | ||||
| 
 | ||||
|   dagEntryOf = elemType: let | ||||
|     submoduleType = types.submodule ({name, ...}: { | ||||
|       options = { | ||||
|         data = mkOption {type = elemType;}; | ||||
|         after = mkOption {type = with types; listOf str;}; | ||||
|         before = mkOption {type = with types; listOf str;}; | ||||
|       }; | ||||
|       config = mkIf (elemType.name == "submodule") { | ||||
|         data._module.args.dagName = name; | ||||
|       }; | ||||
|     }); | ||||
|     maybeConvert = def: | ||||
|       if nvim.dag.isEntry def.value | ||||
|       then def.value | ||||
|       else | ||||
|         nvim.dag.entryAnywhere ( | ||||
|           if def ? priority | ||||
|           then mkOrder def.priority def.value | ||||
|           else def.value | ||||
|         ); | ||||
|   in | ||||
|     mkOptionType { | ||||
|       name = "dagEntryOf"; | ||||
|       description = "DAG entry of ${elemType.description}"; | ||||
|       # leave the checking to the submodule type | ||||
|       merge = loc: defs: | ||||
|         submoduleType.merge loc (map (def: { | ||||
|             inherit (def) file; | ||||
|             value = maybeConvert def; | ||||
|           }) | ||||
|           defs); | ||||
|     }; | ||||
| in rec { | ||||
|   # A directed acyclic graph of some inner type. | ||||
|   # | ||||
|   # Note, if the element type is a submodule then the `name` argument | ||||
|   # will always be set to the string "data" since it picks up the | ||||
|   # internal structure of the DAG values. To give access to the | ||||
|   # "actual" attribute name a new submodule argument is provided with | ||||
|   # the name `dagName`. | ||||
|   dagOf = elemType: let | ||||
|     attrEquivalent = types.attrsOf (dagEntryOf elemType); | ||||
|   in | ||||
|     mkOptionType rec { | ||||
|       name = "dagOf"; | ||||
|       description = "DAG of ${elemType.description}"; | ||||
|       inherit (attrEquivalent) check merge emptyValue; | ||||
|       getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["<name>"]); | ||||
|       getSubModules = elemType.getSubModules; | ||||
|       substSubModules = m: dagOf (elemType.substSubModules m); | ||||
|       functor = (defaultFunctor name) // {wrapped = elemType;}; | ||||
|       nestedTypes.elemType = elemType; | ||||
|     }; | ||||
| } | ||||
							
								
								
									
										81
									
								
								lib/types-plugin.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								lib/types-plugin.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,81 @@ | |||
| {lib}: | ||||
| with lib; let | ||||
|   # Plugin must be same as input name from flake.nix | ||||
|   availablePlugins = [ | ||||
|     # TODO: sort by category | ||||
|     "nvim-treesitter-context" | ||||
|     "gitsigns-nvim" | ||||
|     "plenary-nvim" | ||||
|     "nvim-lspconfig" | ||||
|     "nvim-treesitter" | ||||
|     "lspsaga" | ||||
|     "lspkind" | ||||
|     "nvim-lightbulb" | ||||
|     "lsp-signature" | ||||
|     "nvim-tree-lua" | ||||
|     "nvim-bufferline-lua" | ||||
|     "lualine" | ||||
|     "nvim-compe" | ||||
|     "nvim-autopairs" | ||||
|     "nvim-ts-autotag" | ||||
|     "nvim-web-devicons" | ||||
|     "tokyonight" | ||||
|     "bufdelete-nvim" | ||||
|     "nvim-cmp" | ||||
|     "cmp-nvim-lsp" | ||||
|     "cmp-buffer" | ||||
|     "cmp-vsnip" | ||||
|     "cmp-path" | ||||
|     "cmp-treesitter" | ||||
|     "crates-nvim" | ||||
|     "vim-vsnip" | ||||
|     "nvim-code-action-menu" | ||||
|     "trouble" | ||||
|     "null-ls" | ||||
|     "which-key" | ||||
|     "indent-blankline" | ||||
|     "nvim-cursorline" | ||||
|     "sqls-nvim" | ||||
|     "glow-nvim" | ||||
|     "telescope" | ||||
|     "rust-tools" | ||||
|     "onedark" | ||||
|     "catppuccin" | ||||
|     "minimap-vim" | ||||
|     "dashboard-nvim" | ||||
|     "alpha-nvim" | ||||
|     "scrollbar-nvim" | ||||
|     "codewindow-nvim" | ||||
|     "nvim-notify" | ||||
|     "cinnamon-nvim" | ||||
|     "cheatsheet-nvim" | ||||
|     "colorizer" | ||||
|     "venn-nvim" | ||||
|     "cellular-automaton" | ||||
|     "presence-nvim" | ||||
|     "icon-picker-nvim" | ||||
|     "dressing-nvim" | ||||
|     "orgmode-nvim" | ||||
|     "obsidian-nvim" | ||||
|     "vim-markdown" | ||||
|     "tabular" | ||||
|     "toggleterm-nvim" | ||||
|     "noice-nvim" | ||||
|     "nui-nvim" | ||||
|     "copilot-lua" | ||||
|     "tabnine-nvim" | ||||
|     "nvim-session-manager" | ||||
|     "gesture-nvim" | ||||
|   ]; | ||||
|   # You can either use the name of the plugin or a package. | ||||
|   pluginsType = with types; listOf (nullOr (either (enum availablePlugins) package)); | ||||
| in { | ||||
|   pluginsOpt = { | ||||
|     description, | ||||
|     default ? [], | ||||
|   }: | ||||
|     mkOption { | ||||
|       inherit description default; | ||||
|       type = pluginsType; | ||||
|     }; | ||||
| } | ||||
							
								
								
									
										7
									
								
								lib/types.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								lib/types.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | |||
| {lib}: let | ||||
|   typesDag = import ./types-dag.nix {inherit lib;}; | ||||
|   typesPlugin = import ./types-plugin.nix {inherit lib;}; | ||||
| in { | ||||
|   inherit (typesDag) dagOf; | ||||
|   inherit (typesPlugin) pluginsOpt; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 NotAShelf
				NotAShelf