https://github.com/guangie88/rustfp
C++ implementation of Rust Option/Result and Iterator.
https://github.com/guangie88/rustfp
cpp cpp14 functional-programming iterator monad monadic monadic-optionals monadic-result rust
Last synced: about 2 months ago
JSON representation
C++ implementation of Rust Option/Result and Iterator.
- Host: GitHub
- URL: https://github.com/guangie88/rustfp
- Owner: guangie88
- License: mit
- Created: 2017-04-19T15:46:42.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2022-03-02T13:18:55.000Z (about 3 years ago)
- Last Synced: 2023-03-11T16:08:16.269Z (about 2 years ago)
- Topics: cpp, cpp14, functional-programming, iterator, monad, monadic, monadic-optionals, monadic-result, rust
- Language: C++
- Size: 331 KB
- Stars: 12
- Watchers: 2
- Forks: 1
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# `rustfp`
[](https://travis-ci.org/guangie88/rustfp)
[](https://ci.appveyor.com/project/guangie88/rustfp/branch/master)
[](https://codecov.io/gh/guangie88/rustfp)## Overview
C++14 implementation of Rust Option/Result (monads) and Iterator concepts,
useful for expressing items and result manipulation in a more functional style.* [https://doc.rust-lang.org/std/option/](https://doc.rust-lang.org/std/option/)
* [https://doc.rust-lang.org/std/result/](https://doc.rust-lang.org/std/result/)
* [https://doc.rust-lang.org/std/iter/](https://doc.rust-lang.org/std/iter/)Currently tested to be compiling on `g++-5` and above, `MSVC2015` and above.
`clang` should work as well, as long as the version supports C++14.## Repository Checkout
For Git version 1.6.5 or later:
```bash
git clone --recursive https://github.com/guangie88/rustfp.git
```For already cloned repository or older Git version:
```bash
git clone https://github.com/guangie88/rustfp.git
git submodule update --init --recursive
```## Compilation and Installation
The solution uses CMake (at least version 3.6) for compilation and installation.
To enable unit tests to be compiled for `rustfp`, add
`-DRUSTFP_INCLUDE_UNIT_TESTS=ON` during the CMake configuration step.### Windows Generator Names
* MSVC
* 32-bit
* `MSVC2015`: `Visual Studio 14`
* `MSVC2017`: `Visual Studio 15`
* 64-bit* `MSVC2015`: `Visual Studio 14 Win64`
* `MSVC2017`: `Visual Studio 15 Win64`### Windows Compilation
#### Debug and Release Compilation Example
```bash
mkdir build
cd build
cmake .. -G "Visual Studio 14 Win64" -DCMAKE_INSTALL_PREFIX:PATH=install
cmake --build . --config debug
cmake --build . --config release --target install
```### Linux Generator Names
For Linux, simply run
`export CC=; export CXX=`
before running the CMake commands. As such, there should be no need to set
`-G `.#### Example
```bash
export CC=/usr/bin/gcc-5; export CXX=/usr/bin/g++-5
```### Linux Compilation
Note that `gcc` requires the build type to be specified at the CMake
configuration step.#### Debug Compilation Example
```bash
mkdir build-debug
cd build-debug
cmake .. -DCMAKE_BUILD_TYPE=Debug
cmake --build .
```#### Release Compilation Example
```bash
mkdir build-release
cd build-release
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=install
cmake --build . --target install
```### Installation Extraction
For the header files that are required to be included in other solutions, simply
extract out the following directories in `build/install/include` into your other
desired `include` directory:* `nonstd`
* `mpark`
* `rustfp`## Usage Examples
```c++
#include "rustfp/collect.h"
#include "rustfp/iter.h"
#include "rustfp/map.h"#include
#include
#includeint main() {
const std::vector v_int{0, 1, 2};// rustfp::iter works differently from C++ iterator.
// containers with proper begin/cbegin and end/cend
// has to be wrapped by rustfp::iter before any of
// the FP operations (e.g. map, filter, fold) can be
// used.const auto v_str = rustfp::iter(v_int)
| rustfp::map([](const auto &v) {
// v is of const int & type
return std::to_string(v);
})
| rustfp::collect>();assert(v_str[0] == "0");
assert(v_str[1] == "1");
assert(v_str[2] == "2");
}
```