diff --git a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs index 426931bee8096cffa5e3b41068e05cba67f03b7c..5ab66dde863c8d585cb08b05d99352fa51802f63 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs @@ -258,7 +258,7 @@ IEnumerator __BlossomAndDiePerFrame(FunctionCallFact FCF) List<Fact> factlist = new(); foreach (object i in result) - factlist.AddRange(Fact.MakeFact(i, null, StageStatic.stage.factState, true)); + Fact.MakeFact(factlist, i, null, StageStatic.stage.factState, true); foreach (Fact fact in factlist) SpawnFactRepresentation(fact); @@ -282,7 +282,7 @@ IEnumerator __BlossomDragAndDie(FunctionCallFact FCF) object[] result = FCF.Call(FCF.Domain.t_0); foreach (object i in result) - factlist.AddRange(Fact.MakeFact(i, null, StageStatic.stage.factState, true)); + Fact.MakeFact(factlist, i, null, StageStatic.stage.factState, true); foreach (Fact fact in factlist) SpawnFactRepresentation(fact); @@ -295,7 +295,7 @@ IEnumerator __BlossomDragAndDie(FunctionCallFact FCF) object[] result_media = FCF.Call(current_time); foreach (object i in result_media) - factlist_media.AddRange(Fact.MakeFact(i, null, StageStatic.stage.factState, true)); + Fact.MakeFact(factlist_media, i, null, StageStatic.stage.factState, true); for (int i = 0; i < math.min(factlist.Count, factlist_media.Count); i++) { diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractAngleFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractAngleFact.cs index 50ec738dde1ee81cf8e40ec00926c1c5e69d42b9..8692997e9f1d39f199ab1b5b9466c7f8194c8aee 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractAngleFact.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractAngleFact.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json; using REST_JSON_API; using System; +using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; @@ -168,13 +169,13 @@ public override MMTFact MakeMMTDeclaration() } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (fact is not MMTValueFact value_fact) //If angle is a 90Degree-Angle throw new ArgumentException("Angle 90 degrees parsed. This shouldn't happen anymore"); if (value_fact.lhs is not OMA lhs) - return new(); + yield break; float angle = value_fact.value == null ? -0 @@ -187,9 +188,9 @@ public override MMTFact MakeMMTDeclaration() if (!FactRecorder.AllFacts.ContainsKey(pointAUri) || !FactRecorder.AllFacts.ContainsKey(pointBUri) || !FactRecorder.AllFacts.ContainsKey(pointCUri)) - return new(); + yield break; - return new() { new AngleFact(pointAUri, pointBUri, pointCUri, angle, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new AngleFact(pointAUri, pointBUri, pointCUri, angle, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -266,9 +267,9 @@ public override MMTFact MakeMMTDeclaration() return new MMTGeneralFact(Label, tp, df); } -/// \copydoc Fact.parseFact(ScrollFact) -public new static List<Fact> parseFact(MMTFact fact) -{ + /// \copydoc Fact.parseFact(ScrollFact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) + { if (((MMTGeneralFact)fact).type is not OMA proof_OMA // proof DED || proof_OMA.arguments[0] @@ -278,7 +279,7 @@ is not OMA rightAngleOMA // rightAngle OMA || rightAngleOMA.arguments[0] is not OMS // rightAngle Arg0 ) - return new(); + yield break; string Point1Uri = ((OMS)rightAngleOMA.arguments[0]).uri; string Point2Uri = ((OMS)rightAngleOMA.arguments[1]).uri; @@ -287,9 +288,9 @@ is not OMS // rightAngle Arg0 if (!FactRecorder.AllFacts.ContainsKey(Point1Uri) || !FactRecorder.AllFacts.ContainsKey(Point2Uri) || !FactRecorder.AllFacts.ContainsKey(Point3Uri)) - return new(); + yield break; - return new() { new RightAngleFact(Point1Uri, Point2Uri, Point3Uri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new RightAngleFact(Point1Uri, Point2Uri, Point3Uri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractLineFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractLineFact.cs index 888f386c20121d631846f58eb6ddf98b12b2764b..37db0c761674029f971c4016b88ad2305716e4ff 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractLineFact.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractLineFact.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using REST_JSON_API; +using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -87,7 +88,7 @@ protected override void RecalculateTransform() public override bool HasDependentFacts => true; /// \copydoc Fact.getDependentFactIds - protected override string[] GetDependentFactIds() + protected override string[] GetDependentFactIds() => new string[] { Pid1, Pid2 }; } @@ -154,16 +155,16 @@ public override MMTFact MakeMMTDeclaration() } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { string pointAUri = ((OMS)((OMA)((MMTValueFact)fact).lhs).arguments[0]).uri; string pointBUri = ((OMS)((OMA)((MMTValueFact)fact).lhs).arguments[1]).uri; if (!FactRecorder.AllFacts.ContainsKey(pointAUri) || !FactRecorder.AllFacts.ContainsKey(pointBUri)) - return new(); + yield break; - return new() { new LineFact(pointAUri, pointBUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new LineFact(pointAUri, pointBUri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -203,7 +204,7 @@ public RayFact(string pid1, string pid2, FactRecorder organizer) : base(pid1, pi public override MMTFact MakeMMTDeclaration() { SOMDoc type = new OMS(MMTConstants.LineType); - SOMDoc defines = + SOMDoc defines = new OMA( new OMS(MMTConstants.LineOf), new[] { @@ -215,19 +216,19 @@ public override MMTFact MakeMMTDeclaration() } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTGeneralFact)fact).defines is not OMA defines) - return new(); + yield break; string pointAUri = ((OMS)defines.arguments[0]).uri; string pointBUri = ((OMS)defines.arguments[1]).uri; if (!FactRecorder.AllFacts.ContainsKey(pointAUri) || !FactRecorder.AllFacts.ContainsKey(pointBUri)) - return new(); + yield break; - return new() { new RayFact(pointAUri, pointBUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new RayFact(pointAUri, pointBUri, fact.@ref, StageStatic.stage.factState)); } protected override void RecalculateTransform() diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/CircleFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/CircleFact.cs index ece3b887d9d8eef0bcdb57e4ae9e8bafc777145c..9de6902bdfc9277983c4287c6135755eca3ac517 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/CircleFact.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/CircleFact.cs @@ -3,6 +3,7 @@ using UnityEngine; using Newtonsoft.Json; using REST_JSON_API; +using System.Collections; /// <summary> /// A Circle that is made out of a middle point, a plane and a radius @@ -90,10 +91,10 @@ public CircleFact(string Pid1, string Pid2, float radius, Vector3 normal, SOMDoc /// parses the Circlefact response of the MMT-Server /// </summary> /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTGeneralFact)fact).defines is not OMA df) - return new(); + yield break; OMA planeOMA = (OMA)df.arguments[0]; string planeApplicant = ((OMS)planeOMA.applicant).uri; @@ -125,9 +126,9 @@ public CircleFact(string Pid1, string Pid2, float radius, Vector3 normal, SOMDoc if (!FactRecorder.AllFacts.ContainsKey(M_uri) || !FactRecorder.AllFacts.ContainsKey(A_uri)) - return new(); //If dependent facts do not exist return null + yield break; //If dependent facts do not exist return null - return new() { new CircleFact(M_uri, A_uri, radius, normal, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new CircleFact(M_uri, A_uri, radius, normal, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -252,14 +253,14 @@ public RadiusFact(string Cid1, SOMDoc _ServerDefinition, FactRecorder organizer) } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { string CircleUri = ((OMS)((OMA)((MMTValueFact)fact).lhs).arguments[0]).uri; if (!FactRecorder.AllFacts.ContainsKey(CircleUri)) - return new(); + yield break; - return new() { new RadiusFact(CircleUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new RadiusFact(CircleUri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -361,14 +362,14 @@ public AreaCircleFact(string Cid1, SOMDoc _ServerDefinition, FactRecorder organi } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { string CircleUri = ((OMS)((OMA)((MMTValueFact)fact).lhs).arguments[0]).uri; if (!FactRecorder.AllFacts.ContainsKey(CircleUri)) - return new(); + yield break; - return new() { new AreaCircleFact(CircleUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new AreaCircleFact(CircleUri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -469,19 +470,19 @@ public OnCircleFact(string pid, string cid, SOMDoc _ServerDefinition, FactRecord } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTGeneralFact)fact).type is not OMA type) - return new(); + yield break; string circleUri = ((OMS)((OMA)type.arguments[0]).arguments[0]).uri; string pointUri = ((OMS)((OMA)type.arguments[0]).arguments[1]).uri; if (!FactRecorder.AllFacts.ContainsKey(pointUri) || !FactRecorder.AllFacts.ContainsKey(circleUri)) - return new(); + yield break; - return new() { new OnCircleFact(pointUri, circleUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new OnCircleFact(pointUri, circleUri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -614,10 +615,10 @@ public AngleCircleLineFact(string Cid1, string Rid2, float angle, SOMDoc _Server } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTValueFact)fact).lhs is not OMA lhs) - return new(); + yield break; // init it with 0 degrees, so we don't accidentally generate orthogonalfacts // and the parsing works correctly if smb ever adds a scroll for this @@ -631,9 +632,9 @@ public AngleCircleLineFact(string Cid1, string Rid2, float angle, SOMDoc _Server if (!FactRecorder.AllFacts.ContainsKey(CircleUri) || !FactRecorder.AllFacts.ContainsKey(RayUri)) - return new(); + yield break; - return new() { new AngleCircleLineFact(CircleUri, RayUri, angle, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new AngleCircleLineFact(CircleUri, RayUri, angle, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -752,19 +753,19 @@ public OrthogonalCircleLineFact(string Cid1, string Lid1, SOMDoc _ServerDefiniti } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTGeneralFact)fact).type is not OMA type) - return new(); + yield break; string CircleUri = ((OMS)((OMA)type.arguments[0]).arguments[0]).uri; string LineUri = ((OMS)((OMA)type.arguments[0]).arguments[1]).uri; if (!FactRecorder.AllFacts.ContainsKey(CircleUri) || !FactRecorder.AllFacts.ContainsKey(LineUri)) - return new(); + yield break; - return new() { new OrthogonalCircleLineFact(CircleUri, LineUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new OrthogonalCircleLineFact(CircleUri, LineUri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -867,10 +868,10 @@ public EqualCirclesFact(string Cid1, string Cid2, SOMDoc _ServerDefinition, Fact } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTGeneralFact)fact).type is not OMA proof_OMA) // proof DED - return new(); + yield break; OMA parallel_circles_OMA = (OMA)proof_OMA.arguments[0]; // parallel @@ -879,9 +880,9 @@ public EqualCirclesFact(string Cid1, string Cid2, SOMDoc _ServerDefinition, Fact if (!FactRecorder.AllFacts.ContainsKey(circleAUri) || !FactRecorder.AllFacts.ContainsKey(circleBUri)) - return new(); + yield break; - return new() { new EqualCirclesFact(circleAUri, circleBUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new EqualCirclesFact(circleAUri, circleBUri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -984,10 +985,10 @@ public UnEqualCirclesFact(string Cid1, string Cid2, SOMDoc _ServerDefinition, Fa } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTGeneralFact)fact).type is not OMA proof_OMA) // proof DED - return new(); + yield break; OMA unequal_circles_OMA = (OMA)proof_OMA.arguments[0]; // unequal @@ -996,9 +997,9 @@ public UnEqualCirclesFact(string Cid1, string Cid2, SOMDoc _ServerDefinition, Fa if (!FactRecorder.AllFacts.ContainsKey(circleAUri) || !FactRecorder.AllFacts.ContainsKey(circleBUri)) - return new(); + yield break; - return new() { new UnEqualCirclesFact(circleAUri, circleBUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new UnEqualCirclesFact(circleAUri, circleBUri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs index 3164ffd6239dba607ed65291b026cfd8788fe939..84fcffdb3a05dcc102ff767666c4cdafc42ccc63 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs @@ -7,13 +7,14 @@ using System.Linq; using REST_JSON_API; using System.Drawing; +using System.Collections; public static class ParsingDictionary { //TODO? get rid of this, use reflection? instead, if possible //TODO: docu - public static Dictionary<string, Func<MMTFact, List<Fact>>> parseFactDictionary = new() { + public static Dictionary<string, Func<List<Fact>, MMTFact, IEnumerator>> parseFactDictionary = new() { { MMTConstants.Point, PointFact.parseFact }, { MMTConstants.Metric, @@ -398,7 +399,7 @@ protected virtual string generateLabel() /// </summary> /// <param name="fact">instance to be parsed</param> /// <returns>parsed Fact</returns> - public static List<Fact> parseFact(MMTFact fact) + public static IEnumerator parseFact(List<Fact> ret, MMTFact fact) => null; /// <summary> @@ -506,7 +507,7 @@ static string _SendAdd(string path, string body)//, Action<string> uriCallback) } private static uint bypasscc = 0; - public static List<Fact> MakeFact(object payload, SOMDoc ServerDefinition, FactRecorder organizer, bool BypassServer) + public static void MakeFact(List<Fact> ret, object payload, SOMDoc ServerDefinition, FactRecorder organizer, bool BypassServer) { Type type = payload.GetType(); @@ -514,44 +515,45 @@ public static List<Fact> MakeFact(object payload, SOMDoc ServerDefinition, FactR SOMDoc BypassURI = new OMS($"{bypasscc}_{ServerDefinition}"); if (payload is Fact fact) - return new() { fact }; + ret.Add(fact); else if (payload is float f) - return new() { BypassServer + ret.Add(BypassServer ? new RealLitFact(f, BypassURI, organizer) - : new RealLitFact(f, organizer) }; + : new RealLitFact(f, organizer)); else if (payload is Vector3 point) - return new() { BypassServer + ret.Add(BypassServer ? new PointFact(point, BypassURI, organizer) - : new PointFact(point, Vector3.up, organizer) }; + : new PointFact(point, Vector3.up, organizer)); else if (FuncExtensions.IsFuncType(type, out _)) - return new() { BypassServer + ret.Add(BypassServer ? new FunctionFact(ServerDefinition, BypassURI, organizer) - : new FunctionFact(ServerDefinition, organizer)}; + : new FunctionFact(ServerDefinition, organizer)); else if (TupleExtensions.IsTupleType(type, out _)) - return BypassServer + ret.AddRange(BypassServer ? DynamicTupleFact.MMTFactory(payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer, BypassURI) - : DynamicTupleFact.MMTFactory(payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer); + : DynamicTupleFact.MMTFactory(payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer)); else if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) - return BypassServer + ret.AddRange(BypassServer ? DynamicListFact.MMTFactory((List<dynamic>)payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer, BypassURI) - : DynamicListFact.MMTFactory((List<dynamic>)payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer); + : DynamicListFact.MMTFactory((List<dynamic>)payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer)); else if (type.IsAnonymousType()) - return new(); + return; else throw new NotImplementedException($"For Type {type}."); + return; } } public interface IUnpackable { - public abstract List<Fact> UnpackMe(bool BypassServer); + public abstract IEnumerator UnpackMe(List<Fact> ret, bool BypassServer); } /// <summary> @@ -649,14 +651,14 @@ public PointFact(Vector3 point, SOMDoc _ServerDefinition, FactRecorder organizer } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTGeneralFact)fact).defines is not OMA defines) - return new(); + yield break; ParsingDictionary.parseTermsToId.TryAdd(defines.ToString(), fact.@ref.uri); Vector3 point = SOMDoc.MakeVector3(defines); - return new() { new PointFact(point, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new PointFact(point, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.hasDependentFacts @@ -766,7 +768,7 @@ public OnLineFact(string pid, string rid, SOMDoc _ServerDefinition, FactRecorder } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { string pointUri = ((OMS)((OMA)((OMA)((MMTGeneralFact)fact).type).arguments[0]).arguments[1]).uri; string lineUri = ((OMA)((OMA)((MMTGeneralFact)fact).type).arguments[0]).arguments[0] is OMS @@ -777,9 +779,9 @@ public OnLineFact(string pid, string rid, SOMDoc _ServerDefinition, FactRecorder if (!FactRecorder.AllFacts.ContainsKey(pointUri) || !FactRecorder.AllFacts.ContainsKey(lineUri)) - return new(); + yield break; - return new() { new OnLineFact(pointUri, lineUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new OnLineFact(pointUri, lineUri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -873,10 +875,10 @@ public ParallelLineFact(string Lid1, string Lid2, SOMDoc _ServerDefinition, Fact } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTGeneralFact)fact).type is not OMA type) // proof DED - return new(); + yield break; OMA parallel_lines_OMA = (OMA)type.arguments[0]; // parallel @@ -885,9 +887,9 @@ public ParallelLineFact(string Lid1, string Lid2, SOMDoc _ServerDefinition, Fact if (!FactRecorder.AllFacts.ContainsKey(lineAUri) || !FactRecorder.AllFacts.ContainsKey(lineBUri)) - return new(); + yield break; - return new() { new ParallelLineFact(lineAUri, lineBUri, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new ParallelLineFact(lineAUri, lineBUri, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -989,7 +991,7 @@ private void Init(string[] pid_corners) } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { throw new NotImplementedException(); } @@ -1088,11 +1090,12 @@ public TestFact(string backendURI, FactRecorder organizer) : base(organizer) /// parses the Circlefact response of the MMT-Server /// </summary> /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { string uri = fact.@ref.uri; Debug.Log("TestFact Uri:" + uri); - return new() { new TestFact(uri, StageStatic.stage.factState) }; + ret.Add(new TestFact(uri, StageStatic.stage.factState)); + yield break; } /// \copydoc Fact.generateLabel diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/FunctionFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/FunctionFact.cs index 6eb37e82884eef8b41a63b3873e14bf75e849dbf..11f92e2769407a8a70577bcac6fd213794bca498 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/FunctionFact.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/FunctionFact.cs @@ -5,6 +5,7 @@ using System.Linq; using REST_JSON_API; using System.Linq.Expressions; +using System.Collections; public class FunctionCallFact : FactWrappedCRTP<FunctionCallFact> { @@ -169,18 +170,18 @@ public FunctionFact(SOMDoc Function_SOMDoc, SOMDoc _ServerDefinition, FactRecord protected override void RecalculateTransform() { } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) {// TODO Correctness if (((MMTGeneralFact)fact).defines is not FUN fun && (((MMTGeneralFact)fact).defines is not FallbackWrapper SFW || (fun = SFW.SFunction as FUN) == null) ) - return new(); + yield break; ParsingDictionary.parseTermsToId.TryAdd(fun.ToString(), fact.@ref.uri); - return new() { new FunctionFact(fun, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new FunctionFact(fun, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.hasDependentFacts diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/MMTTypes.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/MMTTypes.cs index cbc3ea9179f739c9d72e7a301d1a5ca8b2523709..bb79a3a9acd627d4f4ef2af7ab6b1c59541d8a96 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/MMTTypes.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/MMTTypes.cs @@ -6,6 +6,7 @@ using UnityEngine; using System.Runtime.CompilerServices; using Newtonsoft.Json; +using System.Collections; /// <summary> /// @@ -157,6 +158,7 @@ protected override bool EquivalentWrapped(ListFact f1, ListFact f2) public class DynamicListFact : FactWrappedCRTP<DynamicListFact>, IUnpackable { + [JsonIgnore] public List<object> payload; public SOMDoc indirect_payload; @@ -227,22 +229,20 @@ public override MMTFact MakeMMTDeclaration() ? throw new NotSupportedException(nameof(indirect_payload) + " must not be null") : new MMTGeneralFact(Label, ListType, indirect_payload); - public static new List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (fact is not MMTGeneralFact MMTSymbol) - return new(); + yield break; List<Fact> orig = MMTFactory(null, MMTSymbol.defines, MMTSymbol.type, StageStatic.stage.factState, MMTSymbol.@ref ); - List<Fact> ret = new(orig); + ret.AddRange(orig); foreach (Fact Fact in orig) if (Fact is DynamicListFact pack) - ret.AddRange(pack.UnpackMe(true)); //TODO: set to false, once Server can index - - return ret; + yield return pack.UnpackMe(ret, true); //TODO: set to false, once Server can index } public SOMDoc SOMDocIndexer(int i) @@ -253,11 +253,11 @@ public SOMDoc SOMDocIndexer(int i) new OMLIT<float>(i) }); - // Best I can do is Equalness protected override bool EquivalentWrapped(DynamicListFact f1, DynamicListFact f2) - => f1.payload.Count == f2.payload.Count + => f1.payload != null && f2.payload != null + && f1.payload.Count == f2.payload.Count && f1.ListType.Equivalent(f2.ListType) - && f1.payload.Zip(f2.payload, (e1, e2) => e1.Equals(e2)).All(b => b); + && f1.payload.SequenceEqual(f2.payload, ApproximationComparer.Instance); protected override string[] GetDependentFactIds() => indirect_payload.GetDependentFactIds(); @@ -267,10 +267,14 @@ protected override void RecalculateTransform() { } protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactRecorder organizer) => new DynamicListFact(payload, indirect_payload?.MapURIs(old_to_new), ListType, organizer); - public List<Fact> UnpackMe(bool BypassServer) - => payload.SelectMany((object p, int i) => - MakeFact(p, SOMDocIndexer(i), _Facts, BypassServer) - ).ToList(); + public IEnumerator UnpackMe(List<Fact> ret, bool BypassServer) + { + for (int i = 0; i < payload.Count; i++) + { + MakeFact(ret, payload[i], SOMDocIndexer(i), _Facts, BypassServer); + yield return null; + } + } } /// <summary> @@ -364,6 +368,7 @@ protected override bool EquivalentWrapped(TupleFact f1, TupleFact f2) public class DynamicTupleFact : FactWrappedCRTP<DynamicTupleFact>, IUnpackable { + [JsonIgnore] object payload; int count; @@ -462,15 +467,16 @@ public override MMTFact MakeMMTDeclaration() ? throw new NotSupportedException(nameof(indirect_payload) + " must not be null") : new MMTGeneralFact(Label, TupleType, indirect_payload); - public static new List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (fact is not MMTGeneralFact MMTSymbol) - return new(); + yield break; - return MMTFactory(null, - MMTSymbol.defines, MMTSymbol.type, - StageStatic.stage.factState, MMTSymbol.@ref - ); + ret.AddRange( + MMTFactory(null, + MMTSymbol.defines, MMTSymbol.type, + StageStatic.stage.factState, MMTSymbol.@ref + )); } public SOMDoc SOMDocIndexer(int i) @@ -496,15 +502,16 @@ public static SOMDoc SOMDocIndexer(int i, int count, SOMDoc indirect_payload) : ret; } - // Best I can do is Equalness protected override bool EquivalentWrapped(DynamicTupleFact f1, DynamicTupleFact f2) { if (f1.count != f2.count - || !f1.TupleType.Equivalent(f2.TupleType)) + || !f1.TupleType.Equivalent(f2.TupleType) + || f1.payload == null || f2.payload == null) return false; for (int i = 0; i < f1.count; i++) - if (!((ITuple)f1.payload)[i].Equals(((ITuple)f2.payload)[i])) + if (!ApproximationComparer.Instance + .Equals(((ITuple)f1.payload)[i], ((ITuple)f2.payload)[i])) return false; return true; @@ -518,14 +525,13 @@ protected override void RecalculateTransform() { } protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactRecorder organizer) => MMTFactory(payload, indirect_payload?.MapURIs(old_to_new), TupleType, organizer)?[0]; - public List<Fact> UnpackMe(bool BypassServer) + public IEnumerator UnpackMe(List<Fact> ret, bool BypassServer) { - List<Fact> ret = new List<Fact>(); - for (int i = 0; i < count; i++) - ret.AddRange(MakeFact(((ITuple)payload)[i], SOMDocIndexer(i), _Facts, BypassServer)); - - return ret; + { + MakeFact(ret, ((ITuple)payload)[i], SOMDocIndexer(i), _Facts, BypassServer); + yield return null; + } } } diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/VolumeFacts.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/VolumeFacts.cs index f9ff1686b55e496d5720441fb4d442d03b686fc3..a26195eda96934d4fd7b86f0f230a65379261af4 100644 --- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/VolumeFacts.cs +++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/VolumeFacts.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System.Collections; +using System.Collections.Generic; using Newtonsoft.Json; using REST_JSON_API; @@ -70,10 +71,10 @@ public ConeVolumeFact(string Cid1, string Pid1, float volume, SOMDoc _ServerDefi } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { if (((MMTValueFact)fact).lhs is not OMA lhs) - return new(); + yield break; string CircleUri = ((OMS)((OMA)lhs.arguments[0]).arguments[0]).uri; string PointUri = ((OMS)((OMA)lhs.arguments[0]).arguments[1]).uri; @@ -84,9 +85,9 @@ public ConeVolumeFact(string Cid1, string Pid1, float volume, SOMDoc _ServerDefi if (!FactRecorder.AllFacts.ContainsKey(CircleUri) || !FactRecorder.AllFacts.ContainsKey(PointUri)) - return new(); + yield break; - return new() { new ConeVolumeFact(CircleUri, PointUri, volume, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new ConeVolumeFact(CircleUri, PointUri, volume, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -212,7 +213,7 @@ public TruncatedConeVolumeFact(string Cid1, string Cid2, float volume, string un } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { string Circle1Uri = ((OMS)((OMA)((OMA)((MMTValueFact)fact).lhs).arguments[0]).arguments[0]).uri; string Circle2Uri = ((OMS)((OMA)((OMA)((MMTValueFact)fact).lhs).arguments[0]).arguments[1]).uri; @@ -223,9 +224,9 @@ public TruncatedConeVolumeFact(string Cid1, string Cid2, float volume, string un if (!FactRecorder.AllFacts.ContainsKey(Circle1Uri) || !FactRecorder.AllFacts.ContainsKey(Circle2Uri)) - return new(); + yield break; - return new() { new TruncatedConeVolumeFact(Circle1Uri, Circle2Uri, volume, UnEqualCirclesProof, proof, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new TruncatedConeVolumeFact(Circle1Uri, Circle2Uri, volume, UnEqualCirclesProof, proof, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel @@ -346,7 +347,7 @@ public CylinderVolumeFact(string Cid1, string Cid2, float volume, string eqProof } /// \copydoc Fact.parseFact(ScrollFact) - public new static List<Fact> parseFact(MMTFact fact) + public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact) { string Circle1Uri = ((OMS)((OMA)((OMA)((MMTValueFact)fact).lhs).arguments[0]).arguments[0]).uri; string Circle2Uri = ((OMS)((OMA)((OMA)((MMTValueFact)fact).lhs).arguments[0]).arguments[1]).uri; @@ -357,9 +358,9 @@ public CylinderVolumeFact(string Cid1, string Cid2, float volume, string eqProof if (!FactRecorder.AllFacts.ContainsKey(Circle1Uri) || !FactRecorder.AllFacts.ContainsKey(Circle2Uri)) - return new(); + yield break; - return new() { new CylinderVolumeFact(Circle1Uri, Circle2Uri, volume, EqualCirclesProof, proof, fact.@ref, StageStatic.stage.factState) }; + ret.Add(new CylinderVolumeFact(Circle1Uri, Circle2Uri, volume, EqualCirclesProof, proof, fact.@ref, StageStatic.stage.factState)); } /// \copydoc Fact.generateLabel diff --git a/Assets/Scripts/InventoryStuff/ScrollDetails.cs b/Assets/Scripts/InventoryStuff/ScrollDetails.cs index 2f969934178a025ea26ff520e721f4a4bdf71ba6..c00da8310920accec2592f7446c66712772d7539 100644 --- a/Assets/Scripts/InventoryStuff/ScrollDetails.cs +++ b/Assets/Scripts/InventoryStuff/ScrollDetails.cs @@ -251,9 +251,10 @@ IEnumerator __GeneratePushoutFacts(List<MMTFact> pushoutFacts) bool samestep = false; for (int i = 0; i < pushoutFacts.Count; i++) { - //yield return null; - List<Fact> new_list = ParsingDictionary.parseFactDictionary[pushoutFacts[i].getType()] - (pushoutFacts[i].MapURIs(oldt_to_new)); + List<Fact> new_list = new(); + yield return ParsingDictionary.parseFactDictionary[pushoutFacts[i].getType()] + (new_list, pushoutFacts[i].MapURIs(oldt_to_new)); + if (new_list.Count == 0) { Debug.LogWarning("Parsing on pushout-fact returned empty List -> One of the dependent facts does not exist or parsing failed"); @@ -262,8 +263,6 @@ IEnumerator __GeneratePushoutFacts(List<MMTFact> pushoutFacts) foreach (Fact new_fact in new_list) { - //yield return null; - Fact added = FactAdder.AddFactIfNotFound(new_fact, out bool exists, samestep, null, ActiveScroll.label); if (!exists) { @@ -276,6 +275,8 @@ IEnumerator __GeneratePushoutFacts(List<MMTFact> pushoutFacts) // AnimateExistingFactEvent.Invoke(_new, FactWrapper.FactMaterials.Hint); // Automaticly done in FactRecorder oldt_to_new.Add(new_fact.Id, added.Id); } + + yield return null; } } @@ -427,9 +428,10 @@ void _processRenderedScroll(Scroll rendered, List<string> hintUris) //If ScrollFact is assigned -> No Hint if (!RenderedScrollFact.IsSet) { - List<Fact> HintFactList = - ParsingDictionary.parseFactDictionary[rendered.requiredFacts[i].getType()] - .Invoke(rendered.requiredFacts[i]); + List<Fact> HintFactList = new(); + ParsingDictionary.parseFactDictionary[rendered.requiredFacts[i].getType()] + .Invoke(HintFactList, rendered.requiredFacts[i]) + .FastForward(); foreach (Fact HintFact in HintFactList) { diff --git a/Assets/Scripts/Utility/Extensions/IEnumeratorExtensions.cs b/Assets/Scripts/Utility/Extensions/IEnumeratorExtensions.cs index 8ed78a4faf3547ef92289f8b451e785edcbfff1b..5dd0533f370a81219c129ebada9378e7f231670a 100644 --- a/Assets/Scripts/Utility/Extensions/IEnumeratorExtensions.cs +++ b/Assets/Scripts/Utility/Extensions/IEnumeratorExtensions.cs @@ -6,7 +6,9 @@ public static class IEnumeratorExtensions { public static void FastForward(this IEnumerator that) { - while(that.MoveNext()) ; + while (that.MoveNext()) + if(that.Current is IEnumerator next) + next.FastForward(); } public static IEnumerator yield_break => _YieldBreak;