/// <summary> /// Performs a pattern match operation. /// </summary> /// <param name="CheckAgainst">Value to check against.</param> /// <param name="AlreadyFound">Variables already identified.</param> /// <returns>Pattern match result</returns> public override PatternMatchResult PatternMatch(IElement CheckAgainst, Dictionary <string, IElement> AlreadyFound) { if (!(CheckAgainst is ObjectValue Obj)) { return(PatternMatchResult.NoMatch); } if (this.quick is null) { Dictionary <string, ScriptNode> Quick = new Dictionary <string, ScriptNode>(); foreach (KeyValuePair <string, ScriptNode> N in this.members) { Quick[N.Key] = N.Value; } this.quick = Quick; } PatternMatchResult Result; if (Obj.AssociatedObjectValue is Dictionary <string, IElement> Object) { foreach (KeyValuePair <string, IElement> P in Object) { if (!(this.quick.ContainsKey(P.Key))) { return(PatternMatchResult.NoMatch); } } foreach (KeyValuePair <string, ScriptNode> P in this.members) { if (Object.TryGetValue(P.Key, out IElement E)) { Result = P.Value.PatternMatch(E, AlreadyFound); } else { Result = P.Value.PatternMatch(ObjectValue.Null, AlreadyFound); } if (Result != PatternMatchResult.Match) { return(Result); } } } else if (Obj.AssociatedObjectValue is Dictionary <string, object> Object2) { foreach (KeyValuePair <string, object> P in Object2) { if (!(this.quick.ContainsKey(P.Key))) { return(PatternMatchResult.NoMatch); } } foreach (KeyValuePair <string, ScriptNode> P in this.members) { if (Object2.TryGetValue(P.Key, out object E)) { Result = P.Value.PatternMatch(Expression.Encapsulate(E), AlreadyFound); } else { Result = P.Value.PatternMatch(ObjectValue.Null, AlreadyFound); } if (Result != PatternMatchResult.Match) { return(Result); } } } return(PatternMatchResult.Match); }