/// <summary> /// Get an array of facts of a specific types. /// </summary> /// <param name="facts">Facts.</param> /// <param name="factTypes">Required types.</param> /// <param name="cache">Cache (optional).</param> /// <returns></returns> public static IEnumerable <IFact> WhereFactsByFactTypes(this IEnumerable <IFact> facts, IEnumerable <IFactType> factTypes, IFactTypeCache cache) { Func <IFact, IFactType> getFactTypeFunc; if (cache != null) { getFactTypeFunc = cache.GetFactType; } else { getFactTypeFunc = fact => fact.GetFactType(); } return(facts.Where(fact => { var factType = getFactTypeFunc(fact); return factTypes.Any(type => type.EqualsFactType(factType)); })); }
/// <summary> /// The first fact of the same type. /// </summary> /// <typeparam name="TFact"></typeparam> /// <param name="facts">Fact list.</param> /// <param name="factType">Fact type.</param> /// <param name="cache">Cache.</param> /// <returns>Fact or null.</returns> public static TFact FirstFactByFactType <TFact>(this IEnumerable <TFact> facts, IFactType factType, IFactTypeCache cache) where TFact : IFact { return(facts.FirstOrDefault(fact => cache.GetFactType(fact).EqualsFactType(factType))); }
/// <summary> /// Get an array of facts of a specific type. /// </summary> /// <param name="facts">Facts.</param> /// <param name="factType">Required type.</param> /// <param name="cache">Cache (optional).</param> /// <returns></returns> public static IEnumerable <IFact> WhereFactsByFactType(this IEnumerable <IFact> facts, IFactType factType, IFactTypeCache cache) { Func <IFact, IFactType> getFactTypeFunc; if (cache != null) { getFactTypeFunc = cache.GetFactType; } else { getFactTypeFunc = fact => fact.GetFactType(); } return(facts.Where(fact => getFactTypeFunc(fact).EqualsFactType(factType))); }
/// <summary> /// Searches for the first occurrence of a priority fact. /// </summary> /// <typeparam name="TFact">Type fact.</typeparam> /// <param name="facts">Fact list.</param> /// <param name="factType">Fact type of 'priority'.</param> /// <param name="cache">Cache.</param> /// <returns><see cref="IPriorityFact"/> fact or null.</returns> public static IPriorityFact FirstPriorityFactByFactType <TFact>(this IEnumerable <TFact> facts, IFactType factType, IFactTypeCache cache) where TFact : IFact { return(facts.FirstFactByFactType(factType, cache) as IPriorityFact); }
/// <summary> /// Checking the equality of facts. /// </summary> /// <param name="first"></param> /// <param name="second"></param> /// <param name="cache"></param> /// <param name="includeFactParams"> /// True - parameters of facts will be compared using the <see cref="EqualsFactParameters(IFactParameter, IFactParameter)"/> method. /// False - Parameters of facts will be compared using the method. /// </param> /// <returns></returns> public static bool EqualsFacts(IFact first, IFact second, IFactTypeCache cache = null, bool includeFactParams = true) { if (first == null) { return(second == null); } else if (second == null) { return(false); } else if (first == second) { return(true); } if (first is ISpecialFact xSpecialFact && second is ISpecialFact ySpecialFact) { return(xSpecialFact.EqualsInfo(ySpecialFact)); } IFactType firstFactType; IFactType secondFactType; if (cache != null) { firstFactType = cache.GetFactType(first); secondFactType = cache.GetFactType(second); } else { firstFactType = first.GetFactType(); secondFactType = second.GetFactType(); } if (!firstFactType.EqualsFactType(secondFactType)) { return(false); } if (!includeFactParams) { return(true); } IReadOnlyCollection <IFactParameter> firstParameters = first.GetParameters(); IReadOnlyCollection <IFactParameter> secondParameters = second.GetParameters(); if (firstParameters.IsNullOrEmpty() && secondParameters.IsNullOrEmpty()) { return(true); } if (firstParameters.IsNullOrEmpty() || secondParameters.IsNullOrEmpty()) { return(false); } if (firstParameters.Count != secondParameters.Count) { return(false); } foreach (IFactParameter xParameter in firstParameters) { bool found = false; foreach (IFactParameter yParameter in secondParameters) { if (EqualsFactParameters(xParameter, yParameter)) { found = true; break; } } if (!found) { return(false); } } return(true); }
protected override IWantActionContext <TWantAction, TFactContainer> GetWantActionContext <TWantAction, TFactContainer>(TWantAction wantAction, TFactContainer container, ISingleEntityOperations singleEntity = null, IFactTypeCache cache = null) { return(base.GetWantActionContext(wantAction, container, singleEntity ?? GetFacade <PrioritySingleEntityOperationsFacade>(), cache)); }
/// <summary> /// Is it possible to start a <see cref="IFactWork"/>. /// </summary> /// <typeparam name="TFactWork"></typeparam> /// <param name="inputFacts">Input facts.</param> /// <param name="factWork"></param> /// <param name="cache"></param> /// <returns></returns> public virtual bool CanInvokeWork <TFactWork>(IEnumerable <IFact> inputFacts, TFactWork factWork, IFactTypeCache cache) where TFactWork : IFactWork { foreach (IFactType requiredFactType in factWork.InputFactTypes) { if (inputFacts.All(inputFact => !cache.GetFactType(inputFact).EqualsFactType(requiredFactType))) { return(false); } } return(true); }
/// <summary> /// Get context for <see cref="IWantAction"/>. /// </summary> /// <typeparam name="TWantAction">Type <paramref name="wantAction"/></typeparam> /// <typeparam name="TFactContainer">Type <paramref name="container"/></typeparam> /// <param name="wantAction">Desired action information</param> /// <param name="container">Fact container</param> /// <param name="singleEntity">Single operations on entities of the FactFactory</param> /// <param name="cache">Cache for fact type</param> /// <returns>Context for <see cref="IWantAction"/>.</returns> protected virtual IWantActionContext <TWantAction, TFactContainer> GetWantActionContext <TWantAction, TFactContainer>(TWantAction wantAction, TFactContainer container, ISingleEntityOperations singleEntity = null, IFactTypeCache cache = null) where TWantAction : IWantAction where TFactContainer : IFactContainer { return(new WantActionContext <TWantAction, TFactContainer> { Cache = cache ?? GetFactTypeCache(), SingleEntity = singleEntity ?? GetFacade <SingleEntityOperationsFacade>(), WantAction = wantAction, Container = container, }); }