{ config, pkgs, lib, ... }: {
  options = {
    yq-merge = lib.mkOption {
      type = lib.types.attrs;
      default = {};
      description = ''
        Use yq to merge config file.
        The yq-merge."<name>" receive attr same as `home.file`.
      '';
      example = ./test.nix;
    };
  };
  config = {
    home.file = builtins.mapAttrs (old_target: value: (value // rec {
      target = "${dirOf old_target}/yq-merge.${baseNameOf old_target}";
      onChange = ''
        if [[ -e ${old_target} ]]; then
          ${pkgs.yq-go}/bin/yq -i ea '. as $item ireduce ({}; . * $item )' ${old_target} ${target}
        else
          cat ${target} > ${old_target}
        fi
      '';
    })) config.yq-merge;
  };
}