Skip to content

Commit 35788e7

Browse files
committed
Adding global DoRender
1 parent a29eef2 commit 35788e7

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

demo/demos/DoRenderDemo.tsx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import * as React from 'react';
2+
import { withState } from '../../src/lib/withState';
3+
import { ChainableComponent } from '../../src/ChainableComponent';
4+
import Step from '../Step';
5+
6+
export const DoRenderDemo =
7+
ChainableComponent.DoRender(
8+
withState(5),
9+
() => withState(5),
10+
() => withState('foo'),
11+
(foo, inner, outer) =>
12+
<div>
13+
{foo.value}
14+
<div>outer: {outer.value}</div>
15+
<button onClick={() => outer.update(outer.value + 1)}>+</button>
16+
17+
<div>inner: {inner.value}</div>
18+
<button onClick={() => inner.update(inner.value + 1)}>+</button>
19+
</div>
20+
)
21+
22+
export default () => (
23+
<Step title="DoRender Demo">
24+
<pre className='code-sample'>
25+
{`import { withState, ChainableComponent } from 'chainable-components';
26+
27+
ChainableComponent.DoRender(
28+
withState(5),
29+
() => withState(5),
30+
() => withState('foo'),
31+
(foo, inner, outer) =>
32+
<div>
33+
{foo.value}
34+
<div>outer: {outer.value}</div>
35+
<button onClick={() => outer.update(outer.value + 1)}>+</button>
36+
37+
<div>inner: {inner.value}</div>
38+
<button onClick={() => inner.update(inner.value + 1)}>+</button>
39+
</div>
40+
)`}
41+
</pre>
42+
{DoRenderDemo}
43+
</Step>
44+
);

src/ChainableComponent.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,66 @@ function Do(a: ChainableComponent<any>, ...fns: Function[]): ChainableComponent<
404404
return doIt(a.map(a2 => [a2]), fns);
405405
}
406406

407+
function DoRender<T1, Z>(
408+
c: ChainableComponent<T1>,
409+
f1: (t1: T1) => React.ReactNode,
410+
): React.ReactNode
411+
412+
function DoRender<T1, T2, Z>(
413+
c: ChainableComponent<T1>,
414+
f1: (t1: T1) => ChainableComponent<T2>,
415+
z: (t2: T2, t1: T1) => React.ReactNode
416+
): React.ReactNode
417+
418+
function DoRender<T1, T2, T3, Z>(
419+
c: ChainableComponent<T1>,
420+
f1: (t1: T1) => ChainableComponent<T2>,
421+
f2: (t2: T2, t1: T1) => ChainableComponent<T3>,
422+
z: (t3: T3, t2: T2, t1: T1) => React.ReactNode
423+
): React.ReactNode
424+
425+
function DoRender<T1, T2, T3, T4, Z>(
426+
c: ChainableComponent<T1>,
427+
f1: (t1: T1) => ChainableComponent<T2>,
428+
f2: (t2: T2, t1: T1) => ChainableComponent<T3>,
429+
f3: (t3: T3, t2: T2, t1: T1) => ChainableComponent<T4>,
430+
z: (t4: T4, t3: T3, t2: T2, t1: T1) => React.ReactNode
431+
): React.ReactNode
432+
433+
function DoRender<T1, T2, T3, T4, T5, Z>(
434+
c: ChainableComponent<T1>,
435+
f1: (t1: T1) => ChainableComponent<T2>,
436+
f2: (t2: T2, t1: T1) => ChainableComponent<T3>,
437+
f3: (t3: T3, t2: T2, t1: T1) => ChainableComponent<T4>,
438+
f4: (t4: T4, t3: T3, t2: T2, t1: T1) => ChainableComponent<T5>,
439+
z: (t5: T5, t4: T4, t3: T3, t2: T2, t1: T1) => React.ReactNode
440+
): React.ReactNode
441+
442+
function DoRender<T1, T2, T3, T4, T5, T6, Z>(
443+
c: ChainableComponent<T1>,
444+
f1: (t1: T1) => ChainableComponent<T2>,
445+
f2: (t2: T2, t1: T1) => ChainableComponent<T3>,
446+
f3: (t3: T3, t2: T2, t1: T1) => ChainableComponent<T4>,
447+
f4: (t4: T4, t3: T3, t2: T2, t1: T1) => ChainableComponent<T5>,
448+
f5: (t5: T5, t4: T4, t3: T3, t2: T2, t1: T1) => ChainableComponent<T6>,
449+
z: (t6: T6, t5: T5, t4: T4, t3: T3, t2: T2, t1: T1) => React.ReactNode
450+
): React.ReactNode
451+
452+
function DoRender(a: ChainableComponent<any>, ...fns: Function[]): React.ReactNode {
453+
function doIt(as: ChainableComponent<any[]>, fns: Function[]): any {
454+
const [fn, ...rest] = fns;
455+
if(rest.length === 0) {
456+
return as.render(a2s => fn.apply(null, a2s));
457+
} else {
458+
return as.render(a2s => {
459+
const aPrime = fn.apply(null, a2s);
460+
return doIt(aPrime.map((aP: any) => [aP, ...a2s]), rest);
461+
});
462+
}
463+
}
464+
return doIt(a.map(a2 => [a2]), fns);
465+
}
466+
407467
const isChainableComponent = (a: any) => {
408468
return typeof a.chain === 'function' &&
409469
typeof a.map === 'function' &&
@@ -424,4 +484,5 @@ export const ChainableComponent = {
424484
'fantasy-land/of': of,
425485
all,
426486
Do,
487+
DoRender
427488
};

0 commit comments

Comments
 (0)