From aacdc171aea0ea3c362a69db9d88335e4b19db6a Mon Sep 17 00:00:00 2001 From: Ludovic 'Archivist' Lagouardette Date: Sun, 23 Sep 2018 14:31:46 +0200 Subject: [PATCH] Compose works (tested) --- .gitignore | 1 + Makefile | 6 ++++ README.md | 0 include/2CL.hpp | 2 ++ include/combinations/all.hpp | 5 ++++ include/combinations/compose.hpp | 47 +++++++++++++++++++++++++++++++ include/combinations/curry.hpp | 20 +++++++++++++ include/combinations/function.hpp | 28 ++++++++++++++++++ include/combinations/tuple.hpp | 28 ++++++++++++++++++ tests/compose.cpp | 15 ++++++++++ tests/void.cpp | 4 +++ 11 files changed, 156 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 include/2CL.hpp create mode 100644 include/combinations/all.hpp create mode 100644 include/combinations/compose.hpp create mode 100644 include/combinations/curry.hpp create mode 100644 include/combinations/function.hpp create mode 100644 include/combinations/tuple.hpp create mode 100644 tests/compose.cpp create mode 100644 tests/void.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +test diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7f16818 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ + + +all: test + +test: + g++ -Iinclude --std=c++17 -o test tests/*.cpp \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/include/2CL.hpp b/include/2CL.hpp new file mode 100644 index 0000000..0a4ea1e --- /dev/null +++ b/include/2CL.hpp @@ -0,0 +1,2 @@ +#pragma once +#include "combinations/all.hpp" \ No newline at end of file diff --git a/include/combinations/all.hpp b/include/combinations/all.hpp new file mode 100644 index 0000000..925ee9c --- /dev/null +++ b/include/combinations/all.hpp @@ -0,0 +1,5 @@ +#pragma once +#include "combinations/function.hpp" +#include "combinations/compose.hpp" +#include "combinations/tuple.hpp" +#include "combinations/curry.hpp" \ No newline at end of file diff --git a/include/combinations/compose.hpp b/include/combinations/compose.hpp new file mode 100644 index 0000000..f3f826a --- /dev/null +++ b/include/combinations/compose.hpp @@ -0,0 +1,47 @@ +#pragma once +#include "combinations/tuple.hpp" + +namespace cl{ + struct sigil_t{ + constexpr sigil_t(){} + }; + sigil_t sigil; + + template + class compose{ + // f . next + a f; + compose next; + public: + compose(a fn1, c ...oth) + : f{fn1} + , next{oth...} + {} + template + auto operator()(t ...Args){ + return next(f(Args...)); + } + + }; + + template + class compose{ + // f . g + a f; + public: + compose(a fn1) + : f{fn1} + {} + template + auto operator()(t ...Args){ + return f(Args...); + } + + }; + + template + auto operator*(a fn1, b fn2) + { + return compose(fn1, fn2); + } +} \ No newline at end of file diff --git a/include/combinations/curry.hpp b/include/combinations/curry.hpp new file mode 100644 index 0000000..5897bf3 --- /dev/null +++ b/include/combinations/curry.hpp @@ -0,0 +1,20 @@ +#pragma once + +namespace cl +{ + template + class curry + { + a param; + fn call; + public: + curry(a p, fn func) + : param{p} + , call{func} + {} + template + auto operator()(b ...Args){ + return call(param, Args...); + } + }; +} \ No newline at end of file diff --git a/include/combinations/function.hpp b/include/combinations/function.hpp new file mode 100644 index 0000000..32dc73b --- /dev/null +++ b/include/combinations/function.hpp @@ -0,0 +1,28 @@ +#pragma once +#include "combinations/curry.hpp" + +namespace cl +{ + template + class function{ + a me; + public: + function(a value) + : me(value) + {} + template + auto operator()(b ...Args){ + return me(Args...); + } + template + auto operator()(cur arg){ + return curry(arg, me); + } + }; + + template + ret invoke(invokable fn, Args ...args) + { + return fn(args...); + } +} \ No newline at end of file diff --git a/include/combinations/tuple.hpp b/include/combinations/tuple.hpp new file mode 100644 index 0000000..2e6076f --- /dev/null +++ b/include/combinations/tuple.hpp @@ -0,0 +1,28 @@ +#pragma once +#include + +namespace cl +{ + template + class tuple{ + a _mine; + tuple _child; + template + friend a get(); + public: + tuple(a mine, b ...child) + : _mine(mine) + , _child(child...) + {} + }; + + + template + constexpr auto get(tuple v) + { + if constexpr (idx!=0) + return get(v._child); + else + return v._mine; + } +} diff --git a/tests/compose.cpp b/tests/compose.cpp new file mode 100644 index 0000000..2a0b201 --- /dev/null +++ b/tests/compose.cpp @@ -0,0 +1,15 @@ +#include "2CL.hpp" +#include + +struct test_001{ + test_001() + { + auto fn = cl::compose( + [](int a)->int{return a+2;}, + [](int a)->int{return a*2;} + ); + assert(fn(1)==6); + } +}; + +test_001 run_001; \ No newline at end of file diff --git a/tests/void.cpp b/tests/void.cpp new file mode 100644 index 0000000..f44b624 --- /dev/null +++ b/tests/void.cpp @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} \ No newline at end of file