Generate(MinLotteryNumber min, MaxLotteryNumber max, LotteryLength length)
        {
            if (min is null)
            {
                throw new ArgumentNullException(nameof(min));
            }
            if (max is null)
            {
                throw new ArgumentNullException(nameof(max));
            }
            if (length is null)
            {
                throw new ArgumentNullException(nameof(length));
            }

            var random  = new Random();
            var numbers = Enumerable.Range(min, max)
                          .OrderBy(x => random.Next())
                          .Take(length)
                          .ToList();

            numbers.Sort();

            return(numbers.Select(x => new LotteryNumber(x)));
        }
        public LotteryResult Run(LotteryRun run)
        {
            if (run is null)
            {
                throw new ArgumentNullException(nameof(run));
            }

            var length = new LotteryLength(run.IncludeBonusBall
                ? _definition.Length + 1
                : _definition.Length);

            var(numbers, bonusBall) = (_generator.Generate(_definition.Min, _definition.Max, length), (LotteryNumber)null);

            if (run.IncludeBonusBall)
            {
                (numbers, bonusBall) = SeparateBonusBallFromLotteryNumbers(numbers);
            }

            return(new LotteryResult(numbers, bonusBall));
        }