@type change() :: natural_language() | exact() | hash_anchored()
@type edit_result() :: %{file: binary(), backup_file: binary(), diff: binary()}
@type exact() :: %{ type: :exact, old_string: String.t(), new_string: String.t(), replace_all: boolean() }
@type hash_anchored() :: %{ type: :hash_anchored, hashes: [String.t()], old_string: String.t(), new_string: String.t() }
@type natural_language() :: %{ type: :natural_language, instruction: String.t(), context: String.t() | nil }