digraph G {
node [fontname = courier, shape = box]
subgraph cluster1 {
label = "Given,"
{rank = same;
anon0 [style = invis]
anon1 [style = invis]
anon0 -> anon1 [label = "⊇\n:"]
}
{rank = same;
"'static" [style = filled]
"'static" -> "'b"
"'b" -> "'a"
}
}
subgraph cluster2 {
label = "we have:"
{rank = same;
anon2 [style = invis]
anon3 [style = invis]
anon2 -> anon3 [label = "subtypes\n:"]
}
f [label = "for<'any> fn(&'any ())\nfn(&'_ ())\nfn(&())", style = filled]
{rank = same;
fs [label = "fn(&'static ())", style = filled]
fb [label = "fn(&'b ())"]
fa [label = "fn(&'a ())"]
}
{rank = same;
s [label = "&'static ()", style = filled]
b [label = "&'b ()"]
a [label = "&'a ()"]
}
fb -> fs [label = "per contrav."]
fa -> fb [label = "per contrav."]
s -> b [label = "per cov."]
b -> a [label = "per cov."]
// HRTB can have its lifetime param be "monomorphized"
f -> fa
f -> fb
f -> fs [label = "per\n\"For all\" ⇒ \"for this one\""]
}
"'a" -> f [style = invis]
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
G cluster1 Given, cluster2 we have: anon0->anon1 : 'static 'static 'b 'b 'static->'b 'a 'a 'b->'a f for<'any> fn(&'any ()) fn(&'_ ()) fn(&()) anon2->anon3 subtypes : fs fn(&'static ()) f->fs per "For all" ⇒ "for this one" fb fn(&'b ()) f->fb fa fn(&'a ()) f->fa fb->fs per contrav. fa->fb per contrav. s &'static () b &'b () s->b per cov. a &'a () b->a per cov.
Fork me on GitHub