Пример #1
0
        /// <summary>Apply the <see cref="InputArguments.ContainsKey"/> argument.</summary>
        /// <param name="values">The underlying values to modify.</param>
        /// <param name="argValue">The argument value.</param>
        private IInvariantSet ApplyContains(IEnumerable <string> values, IInputArgumentValue argValue)
        {
            // skip empty search
            if (string.IsNullOrWhiteSpace(argValue.Raw))
            {
                return(InvariantSets.False);
            }

            // get search values
            string[] search = argValue.Parsed;
            if (this.NormalizeValue != null)
            {
                for (int i = 0; i < search.Length; i++)
                {
                    search[i] = this.NormalizeValue(search[i]);
                }
            }

            // get result
            bool found = values is IInvariantSet set
                ? set.Overlaps(search)
                : InvariantSets.From(search).Overlaps(values);

            return(InvariantSets.FromValue(found));
        }
 /*********
 ** Public methods
 *********/
 /// <summary>Construct an instance.</summary>
 public RandomValueProvider()
     : base(ConditionType.Random, mayReturnMultipleValuesForRoot: false)
 {
     this.EnableInputArguments(required: true, mayReturnMultipleValues: false, maxPositionalArgs: null);
     this.ValidNamedArguments = InvariantSets.FromValue("key");
     this.BaseSeed            = this.GenerateBaseSeed();
 }
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            // get translation
            string?key = input.GetFirstPositionalArg();

            if (string.IsNullOrWhiteSpace(key))
            {
                return(InvariantSets.Empty);
            }
            Translation translation = this.TranslationHelper.Get(key);

            // add tokens
            if (input.HasNamedArgs)
            {
                translation = translation.Tokens(input
                                                 .NamedArgs
                                                 .ToDictionary(p => p.Key, p => this.Stringify(p.Value))
                                                 );
            }

            // add default value
            if (input.NamedArgs.TryGetValue("default", out IInputArgumentValue? defaultValue))
            {
                translation = translation
                              .Default(this.Stringify(defaultValue))
                              .UsePlaceholder(false); // allow setting a blank default
            }

            return(InvariantSets.FromValue(translation));
        }
 /// <inheritdoc />
 public override bool HasBoundedValues(IInputArguments input, [NotNullWhen(true)] out IInvariantSet?allowedValues)
 {
     if (this.TryParseAndRound(input, out decimal value, out _))
     {
         allowedValues = InvariantSets.FromValue(value.ToString(CultureInfo.InvariantCulture));
         return(true);
     }
        /// <inheritdoc />
        public override bool HasBoundedValues(IInputArguments input, [NotNullWhen(true)] out IInvariantSet?allowedValues)
        {
            allowedValues = !input.IsMutable
                ? InvariantSets.From(input.PositionalArgs)
                : null;

            return(allowedValues != null);
        }
Пример #6
0
        /*********
        ** Public methods
        *********/
        /// <summary>Construct an instance.</summary>
        /// <param name="type">The condition type.</param>
        /// <param name="values">Get the current values.</param>
        /// <param name="isValidInContext">Get whether the value provider is applicable in the current context, or <c>null</c> if it's always applicable.</param>
        /// <param name="mayReturnMultipleValues">Whether the root may contain multiple values.</param>
        /// <param name="allowedValues">The allowed values (or <c>null</c> if any value is allowed).</param>
        public ConditionTypeValueProvider(ConditionType type, Func <IEnumerable <string> > values, Func <bool>?isValidInContext = null, bool mayReturnMultipleValues = false, IEnumerable <string>?allowedValues = null)
            : base(type, mayReturnMultipleValues)
        {
            this.IsValidInContextImpl = isValidInContext;
            this.AllowedRootValues    = allowedValues != null?InvariantSets.From(allowedValues) : null;

            this.FetchValues = () => InvariantSets.From(values());
        }
Пример #7
0
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            return(InvariantSets.FromValue(
                       this.GetPathExists(input.GetPositionalSegment())
                       ));
        }
Пример #8
0
 /// <inheritdoc />
 public override bool UpdateContext(IContext context)
 {
     return(this.IsChanged(this.Values, () =>
     {
         return this.Values = this.MarkReady(this.IsValidInContextImpl == null || this.IsValidInContextImpl())
             ? InvariantSets.From(this.FetchValues())
             : InvariantSets.Empty;
     }));
 }
Пример #9
0
        /*********
        ** Public methods
        *********/
        /// <summary>Construct an instance.</summary>
        /// <param name="type">The condition type.</param>
        /// <param name="values">Get the current values.</param>
        /// <param name="saveReader">Handles reading info from the current save.</param>
        /// <param name="mayReturnMultipleValues">Whether the root may contain multiple values.</param>
        /// <param name="allowedValues">The allowed values (or <c>null</c> if any value is allowed).</param>
        public PerPlayerValueProvider(ConditionType type, Func <Farmer, IEnumerable <string> > values, TokenSaveReader saveReader, bool mayReturnMultipleValues = false, IEnumerable <string>?allowedValues = null)
            : base(type, mayReturnMultipleValues)
        {
            this.SaveReader        = saveReader;
            this.AllowedRootValues = allowedValues != null?InvariantSets.From(allowedValues) : null;

            this.FetchValues = player => InvariantSets.From(values(player));
            this.EnableInputArguments(required: false, mayReturnMultipleValues: mayReturnMultipleValues, maxPositionalArgs: null);
        }
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            string?path = input.GetPositionalSegment();

            return(!string.IsNullOrWhiteSpace(path)
                ? InvariantSets.FromValue(this.GetInternalAssetKey(path).Name)
                : InvariantSets.Empty);
        }
Пример #11
0
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            string?path = this.GetAbsolutePath(input.GetPositionalSegment());

            return(path != null
                ? InvariantSets.FromValue(path)
                : InvariantSets.Empty);
        }
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            return(InvariantSets.From(
                       input.PositionalArgs
                       .Where(this.GetPathExists)
                       .Take(1)
                       ));
        }
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            if (!this.TryGetPart(input.PositionalArgs[0], input.PositionalArgs[1], out string?part, out string?error))
            {
                throw new InvalidOperationException(error); // shouldn't happen since we check the input in TryValidateInput
            }
            return(part != null
                ? InvariantSets.FromValue(part)
                : InvariantSets.Empty);
        }
Пример #14
0
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            var values = this
                         .GetContextsFor(input)
                         .Select(context => this.Values.TryGetValue(context, out Weather weather)
                    ? weather.ToString()
                    : Weather.Sun.ToString() // the game treats an invalid context (e.g. MAX) as always sunny
                                 );

            return(InvariantSets.From(values));
        }
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            string?output = this.Type switch
            {
                ConditionType.Lowercase => input.TokenString?.Value?.ToLowerInvariant(),
                ConditionType.Uppercase => input.TokenString?.Value?.ToUpperInvariant(),
                _ => throw new NotSupportedException($"Unimplemented letter case type '{this.Type}'.") // should never happen
            };

            return(InvariantSets.FromValue(output ?? string.Empty));
        }
    }
Пример #16
0
        /// <inheritdoc />
        public override bool UpdateContext(IContext context)
        {
            return(this.IsChanged(this.Values, () =>
            {
                IEnumerable <string>?raw = this.GetValueImpl();
                this.Values = raw != null
                    ? InvariantSets.From(raw)
                    : InvariantSets.Empty;

                this.MarkReady(this.Values.Any());

                return this.Values;
            }));
        }
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            // validate
            this.AssertInput(input);
            if (!input.HasPositionalArgs)
            {
                return(InvariantSets.Empty);
            }

            // get random number for input
            string seedString   = input.GetRawArgumentValue("key") ?? input.TokenString !.Path;
            int    randomNumber = new Random(unchecked (this.BaseSeed + this.GetDeterministicHashCode(seedString))).Next();

            // choose value
            return(InvariantSets.FromValue(input.PositionalArgs[randomNumber % input.PositionalArgs.Length]));
        }
Пример #18
0
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            string?path = input.GetPositionalSegment();

            if (!string.IsNullOrWhiteSpace(path))
            {
                path = PathUtilities.NormalizeAssetName(path);

                if (input.NamedArgs.TryGetValue("separator", out IInputArgumentValue? separator))
                {
                    path = path.Replace(PathUtilities.PreferredAssetSeparator.ToString(), separator.Parsed.FirstOrDefault());
                }

                return(InvariantSets.FromValue(path));
            }

            return(InvariantSets.Empty);
        }
Пример #19
0
        static void Main(string[] args)
        {
            //			BishopMove o = new BishopMove();
            //			Console.WriteLine(o.howManyMoves(4,
            //6,
            //7,
            //4
            //	));

            //BracketExpressions o = new BracketExpressions();
            //Console.WriteLine(o.ifPossible(
            //	"([]X()[()]XX}[])X{{}}]"
            //	));

            InvariantSets o = new InvariantSets();
            Console.WriteLine(o.countSets(new int[]
            { 1, 0, 0, 0 }
                ));

            Console.ReadLine();
        }
Пример #20
0
        /// <summary>Apply the <see cref="InputArguments.ValueAtKey"/> argument.</summary>
        /// <param name="values">The underlying values to modify.</param>
        /// <param name="argValue">The argument value.</param>
        private IInvariantSet ApplyValueAt(IEnumerable <string> values, IInputArgumentValue argValue)
        {
            // parse index
            if (!int.TryParse(argValue.Raw, out int index))
            {
                throw new FormatException($"Invalid '{InputArguments.ValueAtKey}' index '{argValue.Raw}', must be a numeric index."); // should never happen since it's validated before this point
            }
            // get list
            if (values is not IList <string> list)
            {
                list = values.ToArray();
            }

            // get value at index (negative index = from end)
            if (Math.Abs(index) >= list.Count)
            {
                return(InvariantSets.Empty);
            }
            return(InvariantSets.FromValue(index >= 0
                ? list[index]
                : list[list.Count + index]
                                           ));
        }
Пример #21
0
        /// <inheritdoc />
        public virtual IInvariantSet GetValues(IInputArguments input)
        {
            // default logic
            IEnumerable <string> values = this.Values.GetValues(input);

            // apply global input arguments
            if (input.ReservedArgs.Any())
            {
                foreach ((string name, IInputArgumentValue value) in input.ReservedArgsList)
                {
                    if (InputArguments.ContainsKey.EqualsIgnoreCase(name))
                    {
                        values = this.ApplyContains(values, value);
                    }
                    else if (InputArguments.ValueAtKey.EqualsIgnoreCase(name))
                    {
                        values = this.ApplyValueAt(values, value);
                    }
                }
            }

            return(InvariantSets.From(values));
        }
Пример #22
0
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            return(InvariantSets.FromValue(input.PositionalArgs.Length));
        }
Пример #23
0
        /// <inheritdoc />
        public override IEnumerable <string> GetValues(IInputArguments input)
        {
            this.AssertInput(input);

            return(InvariantSets.FromValue(input.TokenString?.Value ?? string.Empty));
        }
 /// <inheritdoc />
 public override bool HasBoundedValues(IInputArguments input, out IInvariantSet allowedValues)
 {
     allowedValues = InvariantSets.From(this.GetValues(input));
     return(true);
 }
Пример #25
0
        /// <summary>Get an immutable token whose value never changes.</summary>
        /// <param name="name">The token name.</param>
        /// <param name="values">The token values.</param>
        private IToken GetImmutableToken(string name, params string[] values)
        {
            IValueProvider valueProvider = new ImmutableValueProvider(name, InvariantSets.From(values));

            return(new Token(valueProvider));
        }
 /// <inheritdoc />
 public override bool HasBoundedValues(IInputArguments input, out IInvariantSet allowedValues)
 {
     allowedValues = InvariantSets.From(input.PositionalArgs);
     return(true);
 }
Пример #27
0
 /*********
 ** Public methods
 *********/
 /// <summary>Construct an instance.</summary>
 public FormatAssetNameValueProvider()
     : base(ConditionType.FormatAssetName, mayReturnMultipleValuesForRoot: false)
 {
     this.EnableInputArguments(required: true, mayReturnMultipleValues: false, maxPositionalArgs: null);
     this.ValidNamedArguments = InvariantSets.FromValue("separator");
 }