private string FormatPartition(Partition partition, decimal total, ReportVerbosity verbosity, string prefix = "")
        {
            var builder = new StringBuilder();

            builder.Append(prefix);

            if (verbosity == ReportVerbosity.Full)
            {
                if (partition.Name == "Other")
                {
                    builder.AppendLine((total * partition.Share).ToString("N0") + $" ({((total * partition.Share) / total).ToString("P")}), people live Elsewhere");
                }

                builder.AppendLine((total * partition.Share).ToString("N0") + $" ({((total * partition.Share) / total).ToString("P")}), people live in {partition.Name}");
            }
            else
            {
                builder.AppendLine($"{partition.Name}: {(total * partition.Share).ToString("N0")}");
            }

            if (partition.Partitions != null)
            {
                foreach (var innerPartition in partition.Partitions)
                {
                    //builder.Append(prefix);
                    builder.Append(FormatPartition(innerPartition, total * partition.Share, verbosity, prefix + "\t"));
                }
            }

            return(builder.ToString());
        }
        public string Report(World world, ReportVerbosity verbosity)
        {
            var builder = new StringBuilder();

            builder.AppendLine(world.Name + " has a population of " + world.Population.ToString("N0"));

            foreach (var continent in world.Continents.OrderByDescending(c => c.Share))
            {
                builder.Append(FormatPartition(continent, world.Population, verbosity));
            }

            return(builder.ToString());
        }