This mapping has 62 all-to-all groups: every node on one side corresponds to every node on the other, and none is deleted or inserted. Each member carries an all N:M badge; selecting one highlights all of its counterparts, in the tree and in the code view alike.

Code view:

A painting is a person's account of this edit as text, recorded independently of the node mapping - a rendering often has several equally defensible answers where the mapping has one. Deletions and insertions carry no position on the opposite side in a painting, so that panel draws no caret for them.

Before

1use crate::database::key_value_database::KeySpace;
2
3pub struct ByKeySpace<T> {
4 infra: T,
5 task_meta: T,
6 task_data: T,
7 forward_task_cache: T,
8 reverse_task_cache: T,
9}
10
11impl<T> ByKeySpace<T> {
12 pub fn new(mut factory: impl FnMut(KeySpace) -> T) -> Self {
13 Self {
14 infra: factory(KeySpace::Infra),
15 task_meta: factory(KeySpace::TaskMeta),
16 task_data: factory(KeySpace::TaskData),
17 forward_task_cache: factory(KeySpace::ForwardTaskCache),
18 reverse_task_cache: factory(KeySpace::ReverseTaskCache),
19 }
20 }
21
22 pub fn get(&self, key_space: KeySpace) -> &T {
23 match key_space {
24 KeySpace::Infra => &self.infra,
25 KeySpace::TaskMeta => &self.task_meta,
26 KeySpace::TaskData => &self.task_data,
27 KeySpace::ForwardTaskCache => &self.forward_task_cache,
28 KeySpace::ReverseTaskCache => &self.reverse_task_cache,
29 }
30 }
31
32 pub fn get_mut(&mut self, key_space: KeySpace) -> &mut T {
33 match key_space {
34 KeySpace::Infra => &mut self.infra,
35 KeySpace::TaskMeta => &mut self.task_meta,
36 KeySpace::TaskData => &mut self.task_data,
37 KeySpace::ForwardTaskCache => &mut self.forward_task_cache,
38 KeySpace::ReverseTaskCache => &mut self.reverse_task_cache,
39 }
40 }
41
42 pub fn iter(&self) -> impl Iterator<Item = (KeySpace, &T)> {
43 [
44 (KeySpace::Infra, &self.infra),
45 (KeySpace::TaskMeta, &self.task_meta),
46 (KeySpace::TaskData, &self.task_data),
47 (KeySpace::ForwardTaskCache, &self.forward_task_cache),
48 (KeySpace::ReverseTaskCache, &self.reverse_task_cache),
49 ]
50 .into_iter()
51 }
52}
53

After

1use crate::database::key_value_database::KeySpace;
2
3pub struct ByKeySpace<T> {
4 infra: T,
5 task_meta: T,
6 task_data: T,
7 task_cache: T,
8}
9
10impl<T> ByKeySpace<T> {
11 pub fn new(mut factory: impl FnMut(KeySpace) -> T) -> Self {
12 Self {
13 infra: factory(KeySpace::Infra),
14 task_meta: factory(KeySpace::TaskMeta),
15 task_data: factory(KeySpace::TaskData),
16 task_cache: factory(KeySpace::TaskCache),
17 }
18 }
19
20 pub fn get(&self, key_space: KeySpace) -> &T {
21 match key_space {
22 KeySpace::Infra => &self.infra,
23 KeySpace::TaskMeta => &self.task_meta,
24 KeySpace::TaskData => &self.task_data,
25 KeySpace::TaskCache => &self.task_cache,
26 }
27 }
28
29 pub fn get_mut(&mut self, key_space: KeySpace) -> &mut T {
30 match key_space {
31 KeySpace::Infra => &mut self.infra,
32 KeySpace::TaskMeta => &mut self.task_meta,
33 KeySpace::TaskData => &mut self.task_data,
34 KeySpace::TaskCache => &mut self.task_cache,
35 }
36 }
37
38 pub fn iter(&self) -> impl Iterator<Item = (KeySpace, &T)> {
39 [
40 (KeySpace::Infra, &self.infra),
41 (KeySpace::TaskMeta, &self.task_meta),
42 (KeySpace::TaskData, &self.task_data),
43 (KeySpace::TaskCache, &self.task_cache),
44 ]
45 .into_iter()
46 }
47}
48

Before

source_file
use_declaration
use "use"
scoped_identifier
scoped_identifier
scoped_identifier
crate "crate"
:: "::"
identifier "database"
:: "::"
identifier "key_value_database"
:: "::"
identifier "KeySpace"
; ";"
struct_item
visibility_modifier
pub "pub"
struct "struct"
type_identifier "ByKeySpace"
type_parameters
< "<"
type_parameter
type_identifier "T"
> ">"
field_declaration_list
{ "{"
field_declaration
field_identifier "infra"
: ":"
type_identifier "T"
, ","
field_declaration
field_identifier "task_meta"
: ":"
type_identifier "T"
, ","
field_declaration
field_identifier "task_data"
: ":"
type_identifier "T"
, ","
field_declaration all 2:1
field_identifier "forward_task_cache" all 2:1
: ":" all 2:1
type_identifier "T" all 2:1
, "," all 2:1
field_declaration all 2:1
field_identifier "reverse_task_cache" all 2:1
: ":" all 2:1
type_identifier "T" all 2:1
, "," all 2:1
} "}"
impl_item
impl "impl"
type_parameters
< "<"
type_parameter
type_identifier "T"
> ">"
generic_type
type_identifier "ByKeySpace"
type_arguments
< "<"
type_identifier "T"
> ">"
declaration_list
{ "{"
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "new"
parameters
( "("
parameter
mutable_specifier "mut"
identifier "factory"
: ":"
abstract_type
impl "impl"
function_type
type_identifier "FnMut"
parameters
( "("
type_identifier "KeySpace"
) ")"
-> "->"
type_identifier "T"
) ")"
-> "->"
type_identifier "Self"
block
{ "{"
struct_expression
type_identifier "Self"
field_initializer_list
{ "{"
field_initializer
field_identifier "infra"
: ":"
call_expression
identifier "factory"
arguments
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "Infra"
) ")"
, ","
field_initializer
field_identifier "task_meta"
: ":"
call_expression
identifier "factory"
arguments
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskMeta"
) ")"
, ","
field_initializer
field_identifier "task_data"
: ":"
call_expression
identifier "factory"
arguments
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskData"
) ")"
, ","
field_initializer all 2:1
field_identifier "forward_task_cache" all 2:1
: ":" all 2:1
call_expression all 2:1
identifier "factory" all 2:1
arguments all 2:1
( "(" all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "ForwardTaskCache" all 2:1
) ")" all 2:1
, "," all 2:1
field_initializer all 2:1
field_identifier "reverse_task_cache" all 2:1
: ":" all 2:1
call_expression all 2:1
identifier "factory" all 2:1
arguments all 2:1
( "(" all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "ReverseTaskCache" all 2:1
) ")" all 2:1
, "," all 2:1
} "}"
} "}"
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "get"
parameters
( "("
self_parameter
& "&"
self "self"
, ","
parameter
identifier "key_space"
: ":"
type_identifier "KeySpace"
) ")"
-> "->"
reference_type
& "&"
type_identifier "T"
block
{ "{"
expression_statement
match_expression
match "match"
identifier "key_space"
match_block
{ "{"
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "Infra"
=> "=>"
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "infra"
, ","
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskMeta"
=> "=>"
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "task_meta"
, ","
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskData"
=> "=>"
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "task_data"
, ","
match_arm all 2:1
match_pattern all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "ForwardTaskCache" all 2:1
=> "=>" all 2:1
reference_expression all 2:1
& "&" all 2:1
field_expression all 2:1
self "self" all 2:1
. "." all 2:1
field_identifier "forward_task_cache" all 2:1
, "," all 2:1
match_arm all 2:1
match_pattern all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "ReverseTaskCache" all 2:1
=> "=>" all 2:1
reference_expression all 2:1
& "&" all 2:1
field_expression all 2:1
self "self" all 2:1
. "." all 2:1
field_identifier "reverse_task_cache" all 2:1
, "," all 2:1
} "}"
} "}"
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "get_mut"
parameters
( "("
self_parameter
& "&"
mutable_specifier "mut"
self "self"
, ","
parameter
identifier "key_space"
: ":"
type_identifier "KeySpace"
) ")"
-> "->"
reference_type
& "&"
mutable_specifier "mut"
type_identifier "T"
block
{ "{"
expression_statement
match_expression
match "match"
identifier "key_space"
match_block
{ "{"
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "Infra"
=> "=>"
reference_expression
& "&"
mutable_specifier "mut"
field_expression
self "self"
. "."
field_identifier "infra"
, ","
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskMeta"
=> "=>"
reference_expression
& "&"
mutable_specifier "mut"
field_expression
self "self"
. "."
field_identifier "task_meta"
, ","
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskData"
=> "=>"
reference_expression
& "&"
mutable_specifier "mut"
field_expression
self "self"
. "."
field_identifier "task_data"
, ","
match_arm all 2:1
match_pattern all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "ForwardTaskCache" all 2:1
=> "=>" all 2:1
reference_expression all 2:1
& "&" all 2:1
mutable_specifier "mut" all 2:1
field_expression all 2:1
self "self" all 2:1
. "." all 2:1
field_identifier "forward_task_cache" all 2:1
, "," all 2:1
match_arm all 2:1
match_pattern all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "ReverseTaskCache" all 2:1
=> "=>" all 2:1
reference_expression all 2:1
& "&" all 2:1
mutable_specifier "mut" all 2:1
field_expression all 2:1
self "self" all 2:1
. "." all 2:1
field_identifier "reverse_task_cache" all 2:1
, "," all 2:1
} "}"
} "}"
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "iter"
parameters
( "("
self_parameter
& "&"
self "self"
) ")"
-> "->"
abstract_type
impl "impl"
generic_type
type_identifier "Iterator"
type_arguments
< "<"
type_binding
type_identifier "Item"
= "="
tuple_type
( "("
type_identifier "KeySpace"
, ","
reference_type
& "&"
type_identifier "T"
) ")"
> ">"
block
{ "{"
call_expression
field_expression
array_expression
[ "["
tuple_expression
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "Infra"
, ","
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "infra"
) ")"
, ","
tuple_expression
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskMeta"
, ","
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "task_meta"
) ")"
, ","
tuple_expression
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskData"
, ","
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "task_data"
) ")"
, ","
tuple_expression all 2:1
( "(" all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "ForwardTaskCache" all 2:1
, "," all 2:1
reference_expression all 2:1
& "&" all 2:1
field_expression all 2:1
self "self" all 2:1
. "." all 2:1
field_identifier "forward_task_cache" all 2:1
) ")" all 2:1
, "," all 2:1
tuple_expression all 2:1
( "(" all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "ReverseTaskCache" all 2:1
, "," all 2:1
reference_expression all 2:1
& "&" all 2:1
field_expression all 2:1
self "self" all 2:1
. "." all 2:1
field_identifier "reverse_task_cache" all 2:1
) ")" all 2:1
, "," all 2:1
] "]"
. "."
field_identifier "into_iter"
arguments
( "("
) ")"
} "}"
} "}"

After

source_file
use_declaration
use "use"
scoped_identifier
scoped_identifier
scoped_identifier
crate "crate"
:: "::"
identifier "database"
:: "::"
identifier "key_value_database"
:: "::"
identifier "KeySpace"
; ";"
struct_item
visibility_modifier
pub "pub"
struct "struct"
type_identifier "ByKeySpace"
type_parameters
< "<"
type_parameter
type_identifier "T"
> ">"
field_declaration_list
{ "{"
field_declaration
field_identifier "infra"
: ":"
type_identifier "T"
, ","
field_declaration
field_identifier "task_meta"
: ":"
type_identifier "T"
, ","
field_declaration
field_identifier "task_data"
: ":"
type_identifier "T"
, ","
field_declaration all 2:1
field_identifier "task_cache" all 2:1
: ":" all 2:1
type_identifier "T" all 2:1
, "," all 2:1
} "}"
impl_item
impl "impl"
type_parameters
< "<"
type_parameter
type_identifier "T"
> ">"
generic_type
type_identifier "ByKeySpace"
type_arguments
< "<"
type_identifier "T"
> ">"
declaration_list
{ "{"
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "new"
parameters
( "("
parameter
mutable_specifier "mut"
identifier "factory"
: ":"
abstract_type
impl "impl"
function_type
type_identifier "FnMut"
parameters
( "("
type_identifier "KeySpace"
) ")"
-> "->"
type_identifier "T"
) ")"
-> "->"
type_identifier "Self"
block
{ "{"
struct_expression
type_identifier "Self"
field_initializer_list
{ "{"
field_initializer
field_identifier "infra"
: ":"
call_expression
identifier "factory"
arguments
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "Infra"
) ")"
, ","
field_initializer
field_identifier "task_meta"
: ":"
call_expression
identifier "factory"
arguments
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskMeta"
) ")"
, ","
field_initializer
field_identifier "task_data"
: ":"
call_expression
identifier "factory"
arguments
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskData"
) ")"
, ","
field_initializer all 2:1
field_identifier "task_cache" all 2:1
: ":" all 2:1
call_expression all 2:1
identifier "factory" all 2:1
arguments all 2:1
( "(" all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "TaskCache" all 2:1
) ")" all 2:1
, "," all 2:1
} "}"
} "}"
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "get"
parameters
( "("
self_parameter
& "&"
self "self"
, ","
parameter
identifier "key_space"
: ":"
type_identifier "KeySpace"
) ")"
-> "->"
reference_type
& "&"
type_identifier "T"
block
{ "{"
expression_statement
match_expression
match "match"
identifier "key_space"
match_block
{ "{"
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "Infra"
=> "=>"
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "infra"
, ","
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskMeta"
=> "=>"
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "task_meta"
, ","
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskData"
=> "=>"
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "task_data"
, ","
match_arm all 2:1
match_pattern all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "TaskCache" all 2:1
=> "=>" all 2:1
reference_expression all 2:1
& "&" all 2:1
field_expression all 2:1
self "self" all 2:1
. "." all 2:1
field_identifier "task_cache" all 2:1
, "," all 2:1
} "}"
} "}"
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "get_mut"
parameters
( "("
self_parameter
& "&"
mutable_specifier "mut"
self "self"
, ","
parameter
identifier "key_space"
: ":"
type_identifier "KeySpace"
) ")"
-> "->"
reference_type
& "&"
mutable_specifier "mut"
type_identifier "T"
block
{ "{"
expression_statement
match_expression
match "match"
identifier "key_space"
match_block
{ "{"
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "Infra"
=> "=>"
reference_expression
& "&"
mutable_specifier "mut"
field_expression
self "self"
. "."
field_identifier "infra"
, ","
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskMeta"
=> "=>"
reference_expression
& "&"
mutable_specifier "mut"
field_expression
self "self"
. "."
field_identifier "task_meta"
, ","
match_arm
match_pattern
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskData"
=> "=>"
reference_expression
& "&"
mutable_specifier "mut"
field_expression
self "self"
. "."
field_identifier "task_data"
, ","
match_arm all 2:1
match_pattern all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "TaskCache" all 2:1
=> "=>" all 2:1
reference_expression all 2:1
& "&" all 2:1
mutable_specifier "mut" all 2:1
field_expression all 2:1
self "self" all 2:1
. "." all 2:1
field_identifier "task_cache" all 2:1
, "," all 2:1
} "}"
} "}"
function_item
visibility_modifier
pub "pub"
fn "fn"
identifier "iter"
parameters
( "("
self_parameter
& "&"
self "self"
) ")"
-> "->"
abstract_type
impl "impl"
generic_type
type_identifier "Iterator"
type_arguments
< "<"
type_binding
type_identifier "Item"
= "="
tuple_type
( "("
type_identifier "KeySpace"
, ","
reference_type
& "&"
type_identifier "T"
) ")"
> ">"
block
{ "{"
call_expression
field_expression
array_expression
[ "["
tuple_expression
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "Infra"
, ","
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "infra"
) ")"
, ","
tuple_expression
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskMeta"
, ","
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "task_meta"
) ")"
, ","
tuple_expression
( "("
scoped_identifier
identifier "KeySpace"
:: "::"
identifier "TaskData"
, ","
reference_expression
& "&"
field_expression
self "self"
. "."
field_identifier "task_data"
) ")"
, ","
tuple_expression all 2:1
( "(" all 2:1
scoped_identifier all 2:1
identifier "KeySpace" all 2:1
:: "::" all 2:1
identifier "TaskCache" all 2:1
, "," all 2:1
reference_expression all 2:1
& "&" all 2:1
field_expression all 2:1
self "self" all 2:1
. "." all 2:1
field_identifier "task_cache" all 2:1
) ")" all 2:1
, "," all 2:1
] "]"
. "."
field_identifier "into_iter"
arguments
( "("
) ")"
} "}"
} "}"