private void Send(long deliveryId, AtLeastOnceDeliverySemantic.Delivery delivery, DateTime timestamp)
        {
            var destination = _context.ActorSelection(delivery.Destination);

            destination.Tell(delivery.Message);

            _unconfirmed = _unconfirmed.SetItem(deliveryId,
                                                new AtLeastOnceDeliverySemantic.Delivery(delivery.Destination, delivery.Message, timestamp,
                                                                                         delivery.Attempt + 1));
        }
        /// <summary>
        ///     TBD
        /// </summary>
        /// <param name="destination">TBD</param>
        /// <param name="deliveryMessageMapper">TBD</param>
        /// <param name="isRecovering">TBD</param>
        /// <exception cref="MaxUnconfirmedMessagesExceededException">
        ///     This exception is thrown when the actor exceeds the <see cref="MaxUnconfirmedMessages" /> count.
        /// </exception>
        public void Deliver(ActorPath destination, Func <long, object> deliveryMessageMapper, bool isRecovering)
        {
            if (_unconfirmed.Count >= MaxUnconfirmedMessages)
            {
                throw new MaxUnconfirmedMessagesExceededException(
                          $"{_context.Self} has too many unconfirmed messages. Maximum allowed is {MaxUnconfirmedMessages}");
            }

            var deliveryId = NextDeliverySequenceNr();
            var now        = isRecovering ? DateTime.UtcNow - RedeliverInterval : DateTime.UtcNow;
            var delivery   =
                new AtLeastOnceDeliverySemantic.Delivery(destination, deliveryMessageMapper(deliveryId), now, 0);

            if (isRecovering)
            {
                _unconfirmed = _unconfirmed.SetItem(deliveryId, delivery);
            }
            else
            {
                Send(deliveryId, delivery, now);
            }
        }