private static Guest ReadOne(TextReader reader, IReadOnlyThemePark themePark)
        {
            var lines = new[]
            {
                reader.ReadLineAsync().Result,
                reader.ReadLineAsync().Result,
                reader.ReadLineAsync().Result,
            };

            // TODO: may check hours are not after park closed
            var entryTimeMinutes = lines[0].ParseInteger();

            VerifyWithinParkHours(entryTimeMinutes, themePark.MaxHoursPerDay);

            var visitCount = lines[1].ParseInteger().VerifyDesiredAttractions();

            var visits = from x in lines[2].Split(' ')
                select x.ParseInteger().VerifyRange(0, themePark.ReadOnlyAttractions.Count - 1);

            // ReSharper disable once PossibleMultipleEnumeration
            visits.Count().VerifyValue(visitCount);

            // ReSharper disable once PossibleMultipleEnumeration
            return new Guest(entryTimeMinutes, themePark, visits);
        }
 public Guest(int entryTimeMinutes, IReadOnlyThemePark themePark, IEnumerable<int> desired)
 {
     _themePark = themePark;
     EntryTimeMinutes = entryTimeMinutes;
     Desired = VerifyDistinct(desired).ToList();
 }
 public static IEnumerable<Guest> ReadAll(TextReader reader, int count, IReadOnlyThemePark themePark)
 {
     while (count-- > 0)
         yield return ReadOne(reader, themePark);
 }
 public Visit(Guest guest, IReadOnlyThemePark themePark, IEnumerable<int> desired)
 {
     _guest = guest;
     _themePark = themePark;
     _desired = desired.ToList();
 }