using System.Collections.Generic; using System.Linq; using Robust.Shared.IoC; using Robust.Shared.Random; using Robust.Shared.Toolshed.TypeParsers; namespace Robust.Shared.Toolshed.Commands.Generic; [ToolshedCommand] public sealed partial class SelectCommand : ToolshedCommand { [Dependency] private IRobustRandom _random = default!; [CommandImplementation, TakesPipedTypeAsGeneric] public IEnumerable Select([PipedArgument] IEnumerable enumerable, Quantity quantity, [CommandInverted] bool inverted) { var arr = enumerable.ToArray(); _random.Shuffle(arr); if (quantity is {Amount: { } amount}) { var taken = (int) System.Math.Ceiling(amount); if (inverted) taken = System.Math.Max(0, arr.Length - taken); return arr.Take(taken); } else { var percent = inverted ? (int) System.Math.Floor(arr.Length * System.Math.Clamp(1 - (double) quantity.Percentage!, 0, 1)) : (int) System.Math.Floor(arr.Length * System.Math.Clamp((double) quantity.Percentage!, 0, 1)); return arr.Take(percent); } } }