public Option <BankAccount> FindBy(Guid id)
        {
            string eventStreamId = GetEventStreamId(id);

            int       afterVersion = 0;
            const int eventCount   = int.MaxValue;

            Option <BankAccountSnapshot> latestSnapshotOption = _appendOnlyStore.GetLatestSnapshot <BankAccountSnapshot>(eventStreamId);

            if (latestSnapshotOption.IsSome)
            {
                afterVersion = latestSnapshotOption.Value.Version;
            }

            var storedEventsOption = _appendOnlyStore.GetStoredEvents(eventStreamId, afterVersion, eventCount);

            if (storedEventsOption.IsNone)
            {
                return(Option.None <BankAccount>());
            }


            if (latestSnapshotOption.IsSome && storedEventsOption.IsSome)
            {
                var snapshot     = latestSnapshotOption.Value;
                var domainEvents = storedEventsOption.Value.Select(x => x.Event);
                var bankAccount  = BankAccount.ReconstructBankAccount(snapshot, domainEvents);

                return(Option.Some(bankAccount));
            }
            else
            {
                var domainEvents = storedEventsOption.Value.Select(x => x.Event);
                var bankAccount  = BankAccount.ReconstructBankAccount(id, domainEvents);

                return(Option.Some(bankAccount));
            }
        }