 @available(macOS 12, iOS 15, tvOS 15, watchOS 8, *)
 public struct AsyncValueObservation<Element>: AsyncSequence {
     public typealias AsyncIterator = Iterator
+    typealias BufferingPolicy = AsyncThrowingStream<Element, Error>.Continuation.BufferingPolicy
     typealias StartFunction = (
         _ onError: @escaping (Error) -> Void,
         _ onChange: @escaping (Element) -> Void)
         -> DatabaseCancellable
-    private var start: StartFunction
-    
-    init(start: @escaping StartFunction) {
-        self.start = start
-    }
+    
+    var bufferingPolicy: BufferingPolicy
+    var start: StartFunction
     
     public func makeAsyncIterator() -> Iterator {
         // This cancellable will be retained by the Iterator, which itself will

        // cancel the observation when the Swift async runtime releases
        // the iterator.
        var cancellable: AnyDatabaseCancellable?
        let stream = AsyncThrowingStream(Element.self, bufferingPolicy: .unbounded) { continuation in
            cancellable = AnyDatabaseCancellable(start(
                // onError
                { error in

    @available(macOS 12, iOS 15, tvOS 15, watchOS 8, *)
    public func values(
        in reader: DatabaseReader,
        scheduling scheduler: ValueObservationScheduler = .async(onQueue: .main),
        bufferingPolicy: BufferingPolicy = .unbounded)
    -> AsyncValueObservation<Reducer.Value>
    {
        AsyncValueObservation(bufferingPolicy: bufferingPolicy) { onError, onChange in
            self.start(in: reader, scheduling: scheduler, onError: onError, onChange: onChange)
        }
    }
