public async ValueTask <IEnumerable <Observation> > FindObservationAsync(Guid sequenceId)
        {
            var sequence = await context.Sequences
                           .Include(s => s.Observations)
                           .FirstOrDefaultAsync(s => s.Id == sequenceId);

            if (sequence == null)
            {
                Throws.SequenceNotFound();
            }

            return(sequence.Observations
                   .OrderBy(o => o.Date)
                   .Select(o =>
            {
                var trafficLight = new Light(
                    o.Color,
                    new TrafficLightDigits(o.High, o.Low));

                var predictedDigits = o
                                      .Digits
                                      .Select(x => new TrafficLightDigits(x))
                                      .ToArray();

                return new Observation(sequenceId, trafficLight, predictedDigits);
            }));
        }
        public async Task SaveObservationAsync(Guid sequenceId, Light trafficLight, IEnumerable <TrafficLightDigits> digits)
        {
            var sequence = await context.Sequences.FindAsync(sequenceId);

            if (sequence == null)
            {
                Throws.SequenceNotFound();
            }

            var observation = new ObservationEntity
            {
                Date   = DateTimeOffset.UtcNow,
                Color  = trafficLight.Color,
                High   = trafficLight.Digits.High.ToBitString(),
                Low    = trafficLight.Digits.Low.ToBitString(),
                Digits = digits.Select(x => x.ToNumber()).ToArray()
            };

            sequence.Observations.Add(observation);

            await context.SaveChangesAsync();
        }