Esempio n. 1
0
        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);
        }