private List <IAnimal> CreateNewBirths(FemaleAnimal parentAnimal, int cycle)
        {
            var newBirthAnimals = new List <IAnimal>();

            Parallel.For(0, parentAnimal.NumberOfBirth, i =>
            {
                var animal = parentAnimal.NewBirthAnimal();

                animal.BirthCycle = cycle + 1;

                newBirthAnimals.Add(animal);
            });

            return(newBirthAnimals);
        }
        public static Coop GetInitialCoopState(AppConfig config)
        {
            var simulationCycle = config.CyclePeriodAtMonth;

            var initialStates = config.Coop.InitialStates;

            var animalsConfig = config.Animals;

            var coop = new Coop()
            {
                MaxPopulationLimit = config.Coop.MaxPopulation
            };

            foreach (var initialState in initialStates)
            {
                var animalConfig = animalsConfig.FirstOrDefault(x => x.Name == initialState.AnimalName);
                for (int i = 0; initialState.Females != null && i < initialState.Females.Count; i++)
                {
                    var newAnimal = new FemaleAnimal()
                    {
                        Name = animalConfig.Name,
                        BirthLimitAgeAtMonth = animalConfig.FemaleBirthAgeAtMonth,
                        BirthAtMonth         = animalConfig.FemaleBirthAtMonth,
                        NumberOfBirth        = animalConfig.FemaleNumberOfBirth,
                        Gender = Gender.Female,
                        Age    = initialState.Females[i].Age
                    };
                    coop.AddAnimal(newAnimal);
                }

                for (int i = 0; i < initialState.Males.Count; i++)
                {
                    var newAnimal = new MaleAnimal()
                    {
                        Name = animalConfig.Name,
                        Age  = initialState.Males[i].Age
                    };

                    coop.AddAnimal(newAnimal);
                }
            }

            return(coop);
        }