public bool Apply(ICompositeState ancestor, ICompositeState descendant, TicNode ancestorNode, TicNode descendantNode) { if (ancestor is StateArray ancArray) { if (descendant is StateArray descArray) { return(SolvingFunctions.Destruction(descArray.ElementNode, ancArray.ElementNode)); } return(true); } if (ancestor is StateFun ancFun) { if (descendant is StateFun descFun) { TraceLog.Write("f+f: "); if (ancFun.ArgsCount == descFun.ArgsCount) { for (int i = 0; i < ancFun.ArgsCount; i++) { SolvingFunctions.Destruction(descFun.ArgNodes[i], ancFun.ArgNodes[i]); } SolvingFunctions.Destruction(ancFun.RetNode, descFun.RetNode); } } } if (ancestor is StateStruct ancStruct) { if (descendant is StateStruct descStruct) { foreach (var ancField in ancStruct.Fields) { var descFieldNode = descStruct.GetFieldOrNull(ancField.Key); if (descFieldNode == null) { //todo!! //throw new ImpossibleException( // $"Struct descendant '{descendantNode.Name}:{descendant}' of node '{ancestorNode.Name}:{ancestor}' miss field '{ancField.Key}'"); descendantNode.State = descStruct.With(ancField.Key, ancField.Value); } else { SolvingFunctions.Destruction(descFieldNode, ancField.Value); } } ancestorNode.State = new StateRefTo(descendantNode); } } return(true); }