/// <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));
 }
Beispiel #7
0
        /// <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);
        }
Beispiel #8
0
 /// <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,
     });
 }