// Copyright (c) Facebook, Inc. and its affiliates. // // Licensed 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. #pragma once #include "yarpl/Refcounted.h" namespace yarpl { namespace flowable { class Subscription { public: virtual ~Subscription() = default; virtual void request(int64_t n) = 0; virtual void cancel() = 0; static std::shared_ptr create(); template static std::shared_ptr create(CancelFunc&& onCancel); template static std::shared_ptr create( CancelFunc&& onCancel, RequestFunc&& onRequest); }; namespace detail { template class CallbackSubscription : public Subscription { static_assert( std::is_same, CancelFunc>::value, "undecayed"); static_assert( std::is_same, RequestFunc>::value, "undecayed"); public: template CallbackSubscription(FCancel&& onCancel, FRequest&& onRequest) : onCancel_(std::forward(onCancel)), onRequest_(std::forward(onRequest)) {} void request(int64_t n) override { onRequest_(n); } void cancel() override { onCancel_(); } private: CancelFunc onCancel_; RequestFunc onRequest_; }; } // namespace detail template std::shared_ptr Subscription::create( CancelFunc&& onCancel, RequestFunc&& onRequest) { return std::make_shared, std::decay_t>>( std::forward(onCancel), std::forward(onRequest)); } template std::shared_ptr Subscription::create(CancelFunc&& onCancel) { return Subscription::create( std::forward(onCancel), [](int64_t) {}); } } // namespace flowable } // namespace yarpl