!7

sS pattern = [[
  CirclesAndLines(circles=[Circle(text="An operation", traits=[], x=d("0.27"), y=d("0.48")), Circle(text="A standard function", traits=[], x=d("0.72"), y=d("0.48"))], lines=[Arrow(a=t5, b=t31, text="is done by", traits=[])], title="An operation")
]];

sS input = [[
  CirclesAndLines(circles=[Circle(text="\"Loading a snippet\"", traits=[], x=d("0.27"), y=d("0.48")), Circle(text="loadSnippet", traits=[], x=d("0.72"), y=d("0.48"))], lines=[Arrow(a=t5, b=t31, text="is done by", traits=[])], title="\"Loading a snippet\"")
]];

sS then = [[
  CirclesAndLines(circles=[Circle(text="An operation", traits=[], x=d("0.27"), y=d("0.48")), Circle(text="some time", traits=[], x=d("0.69"), y=d("0.48"))], lines=[Arrow(a=t5, b=t31, text="takes", traits=[])], title="An operation")
]];
  
  
p {
  Web patternWeb = parseWeb(pattern);
  Web inputWeb = parseWeb(input), originalInputWeb = cloneWeb(inputWeb);
  Web thenWeb = parseWeb(then);
  
Map<WebNode> match = web_matchAllPerms_partial(patternWeb, inputWeb, Double.NaN);
  print("Score: " + web_matchAllPerms_partial_score!);
  print("Match: " + match);
  web_addLabelsFromNodeToNode(match);
  pnl(match);
  Web step4 = cloneWeb(inputWeb);
  Pair<WebNode> p = web_bestNodeMatch(thenWeb, step4);
  if (p != null)
    web_copyUsingPartialMap(thenWeb, step4, litmap(p.a, p.b));
  
  CirclesAndLines.staticPopupExtender = voidfunc(final CirclesAndLines cal, final Canvas canvas, JPopupMenu menu) {
    addMenuItem(menu, jmenu("Operations",
      "First labels only", r { cal_dropSecondaryLabels(cal); canvas.update(); });
  };
  
  CirclesAndLines.this, canvas, menu);
  };
    
  showTabbedWebs("Pattern", patternWeb, "Input", originalInputWeb, "Result", inputWeb, "Then", step4);
  print(ai_allUnclearLabels());
}