@@ -247,6 +247,43 @@ bool Equals(const Signal<D,L>& lhs, const Signal<D,R>& rhs)
247247
248248/* ****************************************/ REACT_BEGIN /* ****************************************/
249249
250+ // /////////////////////////////////////////////////////////////////////////////////////////////////
251+ // / SignalPack - Wraps several nodes in a tuple. Create with comma operator.
252+ // /////////////////////////////////////////////////////////////////////////////////////////////////
253+ template
254+ <
255+ typename D,
256+ typename ... TValues
257+ >
258+ class SignalPack
259+ {
260+ public:
261+ SignalPack (const Signal<D,TValues>& ... deps) :
262+ Data{ std::tie (deps ...) }
263+ {}
264+
265+ template <typename ... TCurValues, typename TAppendValue>
266+ SignalPack (const SignalPack<D, TCurValues ...>& curArgs, const Signal<D,TAppendValue>& newArg) :
267+ Data{ std::tuple_cat (curArgs.Data , std::tie (newArg)) }
268+ {}
269+
270+ std::tuple<const Signal<D,TValues>& ...> Data;
271+ };
272+
273+ // /////////////////////////////////////////////////////////////////////////////////////////////////
274+ // / With - Utility function to create a SignalPack
275+ // /////////////////////////////////////////////////////////////////////////////////////////////////
276+ template
277+ <
278+ typename D,
279+ typename ... TValues
280+ >
281+ auto With (const Signal<D,TValues>& ... deps)
282+ -> SignalPack<D,TValues ...>
283+ {
284+ return SignalPack<D,TValues...>(deps ...);
285+ }
286+
250287// /////////////////////////////////////////////////////////////////////////////////////////////////
251288// / MakeVar
252289// /////////////////////////////////////////////////////////////////////////////////////////////////
@@ -318,24 +355,61 @@ auto MakeVar(V&& value)
318355// /////////////////////////////////////////////////////////////////////////////////////////////////
319356// / MakeSignal
320357// /////////////////////////////////////////////////////////////////////////////////////////////////
358+ // Single arg
321359template
322360<
323361 typename D,
362+ typename TValue,
324363 typename FIn,
364+ typename F = std::decay<FIn>::type,
365+ typename S = std::result_of<F(TValue)>::type,
366+ typename TOp = REACT_IMPL ::FunctionOp<S,F, REACT_IMPL ::SignalNodePtrT<D,TValue>>
367+ >
368+ auto MakeSignal (const Signal<D,TValue>& arg, FIn&& func)
369+ -> TempSignal<D,S,TOp>
370+ {
371+ return TempSignal<D,S,TOp>(
372+ std::make_shared<REACT_IMPL ::SignalOpNode<D,S,TOp>>(
373+ std::forward<FIn>(func), arg.NodePtr ()));
374+ }
375+
376+ // Multiple args
377+ template
378+ <
379+ typename D,
325380 typename ... TValues,
381+ typename FIn,
326382 typename F = std::decay<FIn>::type,
327383 typename S = std::result_of<F(TValues...)>::type,
328384 typename TOp = REACT_IMPL ::FunctionOp<S,F, REACT_IMPL ::SignalNodePtrT<D,TValues> ...>
329385>
330- auto MakeSignal (FIn&& func, const Signal <D,TValues>& ... args )
386+ auto MakeSignal (const SignalPack <D,TValues...>& argPack, FIn&& func )
331387 -> TempSignal<D,S,TOp>
332388{
333- static_assert (sizeof ...(TValues) > 0 ,
334- " react::MakeSignal requires at least 1 signal dependency." );
389+ using REACT_IMPL ::SignalOpNode;
335390
336- return TempSignal<D,S,TOp>(
337- std::make_shared<REACT_IMPL ::SignalOpNode<D,S,TOp>>(
338- std::forward<FIn>(func), args.NodePtr () ... ));
391+ using F = std::decay<FIn>::type;
392+
393+ struct NodeBuilder_
394+ {
395+ NodeBuilder_ (FIn&& func) :
396+ MyFunc{ std::forward<FIn>(func) }
397+ {}
398+
399+ auto operator ()(const Signal<D,TValues>& ... args)
400+ -> TempSignal<D,S,TOp>
401+ {
402+ return TempSignal<D,S,TOp>(
403+ std::make_shared<SignalOpNode<D,S,TOp>>(
404+ std::forward<FIn>(MyFunc), args.NodePtr () ...));
405+ }
406+
407+ FIn MyFunc;
408+ };
409+
410+ return REACT_IMPL::apply (
411+ NodeBuilder_{ std::forward<FIn>(func) },
412+ argPack.Data );
339413}
340414
341415// /////////////////////////////////////////////////////////////////////////////////////////////////
@@ -659,44 +733,7 @@ DECLARE_OP(^, BitwiseXor);
659733#undef DECLARE_OP
660734
661735// /////////////////////////////////////////////////////////////////////////////////////////////////
662- // / SignalPack - Wraps several nodes in a tuple. Create with comma operator.
663- // /////////////////////////////////////////////////////////////////////////////////////////////////
664- template
665- <
666- typename D,
667- typename ... TValues
668- >
669- class SignalPack
670- {
671- public:
672- SignalPack (const Signal<D,TValues>& ... deps) :
673- Data{ std::tie (deps ...) }
674- {}
675-
676- template <typename ... TCurValues, typename TAppendValue>
677- SignalPack (const SignalPack<D, TCurValues ...>& curArgs, const Signal<D,TAppendValue>& newArg) :
678- Data{ std::tuple_cat (curArgs.Data , std::tie (newArg)) }
679- {}
680-
681- std::tuple<const Signal<D,TValues>& ...> Data;
682- };
683-
684- // /////////////////////////////////////////////////////////////////////////////////////////////////
685- // / With - Utility function to create a SignalPack
686- // /////////////////////////////////////////////////////////////////////////////////////////////////
687- template
688- <
689- typename D,
690- typename ... TValues
691- >
692- auto With (const Signal<D,TValues>& ... deps)
693- -> SignalPack<D,TValues ...>
694- {
695- return SignalPack<D,TValues...>(deps ...);
696- }
697-
698- // /////////////////////////////////////////////////////////////////////////////////////////////////
699- // / Comma operator overload to create input pack from 2 signals.
736+ // / Comma operator overload to create signal pack from 2 signals.
700737// /////////////////////////////////////////////////////////////////////////////////////////////////
701738template
702739<
@@ -711,7 +748,7 @@ auto operator,(const Signal<D,TLeftVal>& a, const Signal<D,TRightVal>& b)
711748}
712749
713750// /////////////////////////////////////////////////////////////////////////////////////////////////
714- // / Comma operator overload to append node to existing input pack.
751+ // / Comma operator overload to append node to existing signal pack.
715752// /////////////////////////////////////////////////////////////////////////////////////////////////
716753template
717754<
@@ -725,33 +762,10 @@ auto operator,(const SignalPack<D, TCurValues ...>& cur, const Signal<D,TAppendV
725762 return SignalPack<D, TCurValues ... , TAppendValue>(cur, append);
726763}
727764
728- /* *****************************************/ REACT_END /* *****************************************/
729-
730- /* **************************************/ REACT_IMPL_BEGIN /* *************************************/
731-
732- template
733- <
734- typename D,
735- typename F,
736- typename ... TValues
737- >
738- struct ApplyHelper
739- {
740- static inline auto MakeSignal (F&& func, const Signal<D,TValues>& ... args)
741- -> Signal<D, typename std::result_of<F(TValues ...)>::type>
742- {
743- return D::MakeSignal (std::forward<F>(func), args ...);
744- }
745- };
746-
747- /* ***************************************/ REACT_IMPL_END /* **************************************/
748-
749- /* ****************************************/ REACT_BEGIN /* ****************************************/
750-
751765// /////////////////////////////////////////////////////////////////////////////////////////////////
752- // / operator->* overload to connect inputs to a function and return the resulting node .
766+ // / operator->* overload to connect signals to a function and return the resulting signal .
753767// /////////////////////////////////////////////////////////////////////////////////////////////////
754- // Single input
768+ // Single arg
755769template
756770<
757771 typename D,
@@ -761,25 +775,23 @@ template
761775 class = std::enable_if<
762776 IsSignal<TSignal<D,TValue>>::value>::type
763777>
764- auto operator ->*(const TSignal<D,TValue>& inputNode , F&& func)
778+ auto operator ->*(const TSignal<D,TValue>& arg , F&& func)
765779 -> Signal<D, typename std::result_of<F(TValue)>::type>
766780{
767- return D ::MakeSignal (std::forward<F>(func), inputNode );
781+ return REACT ::MakeSignal (arg, std::forward<F>(func));
768782}
769783
770- // Multiple inputs
784+ // Multiple args
771785template
772786<
773787 typename D,
774788 typename F,
775789 typename ... TValues
776790>
777- auto operator ->*(const SignalPack<D,TValues ...>& inputPack , F&& func)
791+ auto operator ->*(const SignalPack<D,TValues ...>& argPack , F&& func)
778792 -> Signal<D, typename std::result_of<F(TValues ...)>::type>
779793{
780- return apply (
781- REACT_IMPL ::ApplyHelper<D,F,TValues ...>::MakeSignal,
782- std::tuple_cat (std::forward_as_tuple (std::forward<F>(func)), inputPack.Data ));
794+ return REACT::MakeSignal (argPack, std::forward<F>(func));
783795}
784796
785797// /////////////////////////////////////////////////////////////////////////////////////////////////
0 commit comments