{}: let # string -> string -> string colorize = color: string: "[${color}m${string}"; # Taken from `nixpkgs/lib`. # Is here to avoid a dependency on `lib` (making this file easy to test with `nix eval`) warn = # Since Nix 2.23, https://github.com/NixOS/nix/pull/10592 builtins.warn or ( # Do not eta reduce v, so that we have the same strictness as `builtins.warn`. msg: v: # `builtins.warn` requires a string message, so we enforce that in our implementation, so that callers aren't accidentally incompatible with newer Nix versions. assert builtins.isString msg; builtins.trace "${colorize "1;35" "evaluation warning:"} ${msg}" v ); in { mkByName = import ./by-name-overlay.nix {inherit warn;}; # Only merge two attrsets if the RHS does not share names with the LHS. # # Example: # ```nix # let # attr1 = {atuin = "first"; default = "second";}; # attr2 = {atuin = "hi"; other = "hi2";}; # in # maybeMerge attr1 attr2 "Failed to merge" # ``` # # Type: # {} -> {} -> string -> {} maybeMerge = lhs: rhs: sourceSet: let overridden = builtins.intersectAttrs lhs rhs; merged = lhs // rhs; mkWarning = overriddenAttrs: builtins.concatStringsSep " " (builtins.map (colorize "1;97") (builtins.attrNames overriddenAttrs)); in if overridden != {} then warn "Attributes overridden while merging ${sourceSet}: ${mkWarning overridden}" merged else merged; }