Skip to content

Commit 94ca5f6

Browse files
committed
Made Reduce capable of mapping and init value
1 parent f27e1bb commit 94ca5f6

4 files changed

Lines changed: 22 additions & 18 deletions

File tree

src/ReactiveArduinoBases.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ using ReactiveCompound = T(*)(T, T);
2424
template <typename Torig, typename Tdest>
2525
using ReactiveMap = Tdest(*)(Torig);
2626

27+
template <typename Torig, typename Tdest>
28+
using ReactiveReduce = Tdest(*)(Tdest, Torig);
29+
2730
template <typename T>
2831
using ReactivePredicate = bool(*)(T);
2932

src/ReactiveArduinoCore.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ template <typename T> class OperatorNoReset;
7676
template <typename T> class OperatorReset;
7777

7878
template <typename T> class TransformationSelect;
79-
template <typename T> class TransformationReduce;
79+
template <typename Torig, typename Tdest> class TransformationReduce;
8080
template <typename Torig, typename Tdest> class TransformationCast;
8181
template <typename Torig, typename Tdest> class TransformationMap;
8282
template <typename T> class TransformationLimit;
@@ -182,7 +182,7 @@ class Observable : IObservable<T>, IResetable<T>
182182
template <class Tdest> TransformationCast<T, Tdest>& Cast();
183183
template <class Tdest> TransformationMap<T, Tdest>& Select(ReactiveMap<T, Tdest> map);
184184
template <class Tdest> TransformationMap<T, Tdest>& Map(ReactiveMap<T, Tdest> map);
185-
TransformationReduce<T>& Reduce(ReactiveCompound<T> function);
185+
template <class Tdest> TransformationReduce<T, Tdest>& Reduce(ReactiveReduce<T, Tdest> function, Tdest init = Tdest());
186186
TransformationUpperLimit<T>& LimitUpper(T upperLimit);
187187
TransformationLowerLimit<T>& LimitLower(T lowerLimit);
188188
TransformationLimit<T>& Limit(T lowerLimit, T upperLimit);
@@ -473,9 +473,10 @@ auto Observable<T>::Select(ReactiveMap<T, Tdest> map) -> TransformationMap<T, Td
473473

474474

475475
template <typename T>
476-
auto Observable<T>::Reduce(ReactiveCompound<T> function) -> TransformationReduce<T>&
476+
template <typename Tdest>
477+
auto Observable<T>::Reduce(ReactiveReduce<T, Tdest> function, Tdest init) -> TransformationReduce<T, Tdest>&
477478
{
478-
auto newOp = new TransformationReduce<T>(function);
479+
auto newOp = new TransformationReduce<T, Tdest>(function, init);
479480
Compound(*this, *newOp);
480481
return *newOp;
481482
}

src/ReactiveArduinoLib.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -376,10 +376,10 @@ namespace Reactive
376376
return *(new TransformationMap<Torig, Tdest>(map));
377377
}
378378

379-
template <typename T>
380-
TransformationReduce<T>& Reduce(ReactiveCompound<T> function)
379+
template <typename Torig, typename Tdest>
380+
TransformationMap<Torig, Tdest>& Reduce(ReactiveMap<Torig, Tdest> map)
381381
{
382-
return *(new TransformationReduce<T>(function));
382+
return *(new TransformationReduce<Torig, Tdest>(map));
383383
}
384384

385385
template <typename T>

src/Transformations/TransformationReduce.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,29 @@ Unless required by applicable law or agreed to in writing, software distributed
1010
#ifndef _REACTIVETRANSFORMATIONREDUCE_h
1111
#define _REACTIVETRANSFORMATIONREDUCE_h
1212

13-
template <typename T>
14-
class TransformationReduce : public Operator<T, T>
13+
template <typename Torig, typename Tdest>
14+
class TransformationReduce : public Operator<Torig, Tdest>
1515
{
1616
public:
17-
ReactiveCompound<T> _function;
17+
ReactiveReduce<Torig, Tdest> _function;
1818

19-
TransformationReduce<T>(ReactiveCompound<T> function);
19+
TransformationReduce<Torig, Tdest>(ReactiveReduce<Torig, Tdest> function, Tdest init);
2020

21-
void OnNext(T value) override;
21+
void OnNext(Torig value) override;
2222

2323
private:
24-
T _rst = T();
25-
24+
Tdest _rst;
2625
};
2726

28-
template <typename T>
29-
TransformationReduce<T>::TransformationReduce(ReactiveCompound<T> function)
27+
template <typename Torig, typename Tdest>
28+
TransformationReduce<Torig, Tdest>::TransformationReduce(ReactiveReduce<Torig, Tdest> function, Tdest init)
3029
{
3130
this->_function = function;
31+
this->_rst = init;
3232
}
3333

34-
template <typename T>
35-
void TransformationReduce<T>::OnNext(T value)
34+
template <typename Torig, typename Tdest>
35+
void TransformationReduce<Torig, Tdest>::OnNext(Torig value)
3636
{
3737
this->_rst = this->_function(this->_rst, value);
3838
if (this->_childObserver != nullptr) this->_childObserver->OnNext(this->_rst);

0 commit comments

Comments
 (0)