blob: 6f77da9b97fbd8a640824cafeaff6976edc762c1 [file] [log] [blame]
////
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
////
= PushStreams
WARNING: The PushStreams library is still a work in progress.
[plantuml]
.Class diagram of celix::PushStreams::PushStream
----
@startuml
interface IPushEventConsumer<T> {
accept(const PushEvent<T>& event)
}
class PushEventConsumer<T> {
accept(const PushEvent<T>& event)
std::function eventFunction
}
class StreamPushEventConsumer<T> {
accept(const PushEvent<T>& event)
}
PushEventConsumer --|> IPushEventConsumer
StreamPushEventConsumer --|> IPushEventConsumer
class PromiseFactory
class PushStream<T> <<abstract>> {
Promise<void> forEach(ForEachFunction func);
PushStream<T>& filter(PredicateFunction predicate);
PushStream<R>& map(std::function<R(const T&)>);
std::vector<std::shared_ptr<PushStream<T>>> split(std::vector<PredicateFunction> predicates);
PushStream<T>& onClose(CloseFunction closeFunction);
PushStream<T>& onError(ErrorFunction errorFunction);
void close();
}
class UnbufferedPushStream<T>
class BufferedPushStream<T>
class IntermediatePushStream<T, R>
UnbufferedPushStream --|> PushStream
IntermediatePushStream --|> PushStream
BufferedPushStream --|> UnbufferedPushStream
StreamPushEventConsumer --> PushStream : weak_ptr
PushStream --> PromiseFactory
PushStream --> PushEventConsumer : nextEvent
@enduml
----
[plantuml]
.Class diagram of celix::PushStreams::EventSource
----
@startuml
interface IPushEventSource<T> {
virtual void open(std::shared_ptr<IPushEventConsumer<T>> pec);
}
class AbstractEventSource<T> {
void publish(const T& event);
celix::Promise<void> connectPromise();
void open(std::shared_ptr<IPushEventConsumer<T>> _eventConsumer);
bool isConnected();
void close() override;
void execute(std::function<void()> task) = 0;
}
class SimplePushEventSource<T> {
void execute(std::function<void()> task)
}
class SynchronousPushEventSource<T> {
void execute(std::function<void()> task)
}
AbstractEventSource --|> IPushEventSource
SimplePushEventSource --|> AbstractEventSource
SynchronousPushEventSource --|> AbstractEventSource
@enduml
----
[plantuml]
.Class diagram of celix::PushStreams::PushStreamProvider
----
@startuml
class PushStreamProvider {
[[nodiscard]] std::shared_ptr<celix::SimplePushEventSource<T>> createSimpleEventSource();
[[nodiscard]] std::shared_ptr<celix::SynchronousPushEventSource<T>> createSynchronousEventSource();
[[nodiscard]] std::shared_ptr<celix::PushStream<T>> createUnbufferedStream(std::shared_ptr<IPushEventSource<T>> eventSource);
[[nodiscard]] std::shared_ptr<celix::PushStream<T>> createStream(std::shared_ptr<celix::IPushEventSource<T>> eventSource);
}
note left
Design assumes that user takes
shared ownership of shared_ptr
end note
@enduml
----
Sequence below
[plantuml]
.Sequence
----
@startuml
actor Test
participant PushStreamProvider as psp
participant SimpleEventSource as ses
participant UnbufferedPushStream as ubps
participant IntermediatePushStream as ips
Test --> psp: createSimpleEventSource
psp -> ses ** : create
Test --> psp: createStream(simleEventSource)
psp -> ubps ** : create
Test -> ubps: filter: ips
ubps -> ips ** : create
ubps -> ubps : setPredicateWithDownStream
Test -> ips: forEach (f)
ips-> ips: build
activate ips
ips -> ses : open
note left
lambla provided by PushStreamProvider
end note
@enduml
----
Closing strategy.
Streams, and sources have close() method.
Streams, will send downstream close event, the sink will initiate an upstream close.
Sources will close streams by sending close event, this will lead to an upstream close and upstream in sink