public static TResult Visit <TResult>(this IJsonVisitor <TResult> visitor, JsonValue value) { switch (value) { case JsonObject jsonObject: return(visitor.Object(jsonObject)); case JsonArray jsonArray: return(visitor.Array(jsonArray)); case JsonPrimitive jsonPrimitive: return(visitor.Primitive(jsonPrimitive)); default: throw new ArgumentException($"Unexpected JSON type {value.Type} in evaluation tree"); } }