!7

sS inputDiagrams = [[
  CirclesAndLines(circles=[Circle(text="Today's project", x=d("0.24927953890489912"), y=d("0.1760154738878143")), Circle(text="Showing", x=d("0.24639769452449567"), y=d("0.4816247582205029")), Circle(text="a JButton", x=d("0.5547550432276657"), y=d("0.4796905222437137")), Circle(text="an image", x=d("0.43948126801152737"), y=d("0.758220502901354")), Circle(text="a text", x=d("0.7103746397694525"), y=d("0.7620889748549323"))], lines=[Arrow(a=t5, b=t26, text="is"), Arrow(a=t26, b=t47, text=""), Arrow(a=t47, b=t68, text="with"), Arrow(a=t47, b=t89, text="with")], title="Today's project")
  CirclesAndLines(circles=[Circle(text="What I can do", x=d("0.24927953890489912"), y=d("0.1760154738878143")), Circle(text="Showing", x=d("0.24639769452449567"), y=d("0.4816247582205029")), Circle(text="a JButton", x=d("0.5547550432276657"), y=d("0.4796905222437137")), Circle(text="a text", x=d("0.7103746397694525"), y=d("0.7620889748549323"))], lines=[Arrow(a=t5, b=t26, text="is"), Arrow(a=t26, b=t47, text=""), Arrow(a=t47, b=t68, text="with")], title="What I could already do")
  CirclesAndLines(circles=[Circle(text="What I can do", x=d("0.24927953890489912"), y=d("0.1760154738878143")), Circle(text="Showing", x=d("0.24639769452449567"), y=d("0.4816247582205029")), Circle(text="a JButton", x=d("0.5547550432276657"), y=d("0.4796905222437137")), Circle(text="an image", x=d("0.41210374639769454"), y=d("0.758220502901354"))], lines=[Arrow(a=t5, b=t26, text="is"), Arrow(a=t26, b=t47, text=""), Arrow(a=t47, b=t68, text="with")], title="What I could already do 2")
]];

p-subst {
  L<Web> webs = websFromCALStructures(inputDiagrams);
  JTextPane tpAnswer = setFont(sansSerif(20), jcenteredtextpane());
  setFrameSize(700, 500, showTabbedWebs(listPlus((L) webs, "Computer's Insight", jBackground(Color.white, jFullCenter(tpAnswer)))));
  
  // Just print some stuff
  
  print(web_starterNodes(first(webs)));
  
  webs = map cloneWeb(webs);
  L<WebTree> trees = map(webs, func(Web web) {
    webTree_sortChildren(webTree_renameHead("*", web_makeTree(web_starterNode(web))))
  });
  map web_printWebTree(trees);
  
  // Do the actual calculation

  L<Pair<WebNode>> diff1 = webs_differingNodes(first(webs), second(webs));
  L<Pair<WebNode>> diff2 = webs_differingNodes(first(webs), last(webs));
  if (l(diff1) == 1 && l(diff2) == 1) {
    Pair<WebNode> a = first(diff1), b = first(diff2);
    if (a.a == b.a) {
      WebNode node = a.a;
      print("Looking at " + node);
      L<WebNode> nu = web_forwardRelated(node);
      L<WebNode> old1 = web_forwardRelated(a.b);
      L<WebNode> old2 = web_forwardRelated(b.b);
      Set<S> t_nu = web_textSet(nu), t_old1 = web_textSet(old1), t_old2 = web_textSet(old2);
      if (eq(t_nu, joinTreeSets(t_old1, t_old2))) {
        showAnimationInTopLeftCorner(#1010239, 5);
        S answer = "AHA!!\n\nYou want to combine " + join(" AND ", t_nu) + " into " + web_text(node) + ".";
        setText(tpAnswer, infoBoxAndReturn(answer));
      }
    }
  }
}