From 8da06cb998ac40998e3caf25cad358bef9e00bca Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 10 Dec 2018 16:51:20 +0700 Subject: [PATCH] add examples to README --- README.md | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/README.md b/README.md index 763ad01..efb9e87 100644 --- a/README.md +++ b/README.md @@ -28,4 +28,160 @@ #include "promise.hpp" ``` +## Examples + +### Creating a promise + +```cpp +#include "promise.hpp" +using promise_hpp; + +promise download(const std::string& url) +{ + promise result; + + web_client.download_with_callbacks( + [result](const std::string& html) + { + result.resolve(html); + }, + [result](int error_code) + { + result.reject(std::runtime_error("error code: " + std::string(error_code))); + }); + + return result; +} +``` + +### Alternative way to create a promise + +```cpp +promise p = make_promise( + [](auto&& resolver, auto&& rejector) + { + web_client.download_with_callbacks( + [resolver](const std::string& html) + { + resolver(html); + }, + [rejector](int error_code) + { + rejector(std::runtime_error("error code: " + std::string(error_code))); + }); + }); +``` + +### Waiting for an async operation + +```cpp +download("http://www.google.com") + .then([](const std::string& html) + { + std::cout << html << std::endl; + }) + .except([](std::exception_ptr e) + { + try { + std::rethrow_exception(e); + } catch (const std::exception& ee) { + std::cerr << ee.what() << std::endl; + } + }); +``` + +### Chaining async operations + +```cpp +download("http://www.google.com") + .then([](const std::string& html) + { + return download(extract_first_link(html)); + }) + .then([](const std::string& first_link_html) + { + std::cout << first_link_html << std::endl; + }) + .except([](std::exception_ptr e) + { + try { + std::rethrow_exception(e); + } catch (const std::exception& ee) { + std::cerr << ee.what() << std::endl; + } + }); +``` + +### Transforming promise results + +```cpp +download("http://www.google.com") + .then([](const std::string& html) + { + return extract_all_links(html); + }) + .then([](const std::vector& links) + { + for ( const std::string& link : links ) { + std::cout << link << std::endl; + } + }); +``` + +### Combining multiple async operations + +```cpp +std::vector urls{ + "http://www.google.com", + "http://www.yandex.ru"}; + +std::vector> url_promises; +std::transform(urls.begin(), urls.end(), url_promises.begin(), download); + +pr::make_all_promise(url_promises) + .then([](const std::vector& pages) + { + std::vector all_links; + for ( const std::string& page : pages ) { + std::vector page_links = extract_all_links(page); + all_links.insert( + all_links.end(), + std::make_move_iterator(page_links.begin()), + std::make_move_iterator(page_links.end())); + } + return all_links; + }) + .then([](const std::vector& all_links) + { + for ( const std::string& link : all_links ) { + std::cout << link << std::endl; + } + }); +``` + +### Chaining multiple async operations + +```cpp +download("http://www.google.com") + .then_all([](const std::string& html) + { + std::vector> url_promises; + std::vector links = extract_all_links(html); + std::transform(links.begin(), links.end(), url_promises.begin(), download); + return url_promises; + }) + .then([](const std::vector& all_link_page_htmls) + { + // ... + }) + .except([](std::exception_ptr e) + { + // ... + }); +``` + +## API + +> coming soon! + ## [License (MIT)](./LICENSE.md)