|
1 |
| -import { FC, useContext, useEffect, useRef, useState } from "react"; |
2 |
| -import { CallElement, CallFunction, Return, IfElse } from "./program/compute"; |
3 |
| -import { Add, Multiply, One, Two, multiplyNodes, nodeToNumber, numberToNode } from "./program/natural-numbers"; |
| 1 | +import React, { FC, useEffect, useRef, useState } from 'react'; |
| 2 | +import { CallElement, CallFunction, IfElse, EvaluateAll } from './program/compute'; |
| 3 | +import { Add, Multiply, N, One, numberToNode } from './program/natural-numbers'; |
4 | 4 |
|
5 |
| -const Factorial: FC<any> = ({ n }) => { |
6 |
| - const onReturn = useContext(Return); |
7 |
| - const [count, setCount] = useState(n); // TODO: Subtraction |
| 5 | +const Factorial: FC<any> = React.memo(({ n }) => { |
| 6 | + const [count, setCount] = useState(n); |
8 | 7 | const [result, setResult] = useState(<One />);
|
9 | 8 |
|
10 | 9 | useEffect(() => {
|
11 |
| - setCount(count - 1); |
12 |
| - setResult((result) => <>{multiplyNodes(numberToNode(count), result)}</>); |
| 10 | + if ((window as any).PLEASE_STOP) return; |
| 11 | + // TODO: Subtraction in react |
| 12 | + // TODO: Fix timeout |
| 13 | + setTimeout(() => setCount(count - 1), 50) |
13 | 14 | }, [count]);
|
14 | 15 |
|
15 | 16 | return (
|
16 | 17 | <>
|
17 | 18 | Calculating factorial of {n}...
|
18 | 19 | <IfElse condition={count <= 1}>
|
19 |
| - <CallElement fn={<Add>{result}</Add>}> |
20 |
| - {result => <CallFunction fn={() => onReturn(result)} />} |
| 20 | + <Add>{result}</Add> |
| 21 | + <CallElement key={count} fn={<Multiply a={result} b={numberToNode(count)} />}> |
| 22 | + {product => <CallFunction fn={() => setResult(numberToNode(product))} />} |
21 | 23 | </CallElement>
|
22 |
| - <></> |
23 | 24 | </IfElse>
|
24 | 25 | </>
|
25 | 26 | );
|
26 |
| -}; |
| 27 | +}); |
27 | 28 |
|
28 |
| -const Fibonacci: FC<any> = ({ n }) => { |
29 |
| - const onReturn = useContext(Return); |
| 29 | +const Fibonacci: FC<any> = React.memo(({ n }) => { |
30 | 30 | const [count, setCount] = useState(n);
|
31 | 31 | const prevResult = useRef(<></>);
|
32 | 32 | const [result, setResult] = useState(<One />);
|
33 | 33 |
|
34 | 34 | useEffect(() => {
|
35 |
| - setCount(count - 1); |
36 |
| - const prev = prevResult.current; |
37 |
| - prevResult.current = result; |
38 |
| - setResult((result) => <>{result}{prev}</>); |
| 35 | + if ((window as any).PLEASE_STOP) return; |
| 36 | + setTimeout(() => setCount(count - 1), 50); |
39 | 37 | }, [count, result]);
|
40 | 38 |
|
41 | 39 | return (
|
42 | 40 | <>
|
43 | 41 | Calculating fibonacci number {n}...
|
44 |
| - <IfElse condition={count <= 1}> |
45 |
| - <CallElement fn={<Add>{result}</Add>}> |
46 |
| - {result => <CallFunction fn={() => onReturn(result)} />} |
| 42 | + <IfElse condition={count < 1}> |
| 43 | + <Add>{result}</Add> |
| 44 | + <CallElement key={count} fn={<Add>{prevResult.current}{result}</Add>}> |
| 45 | + {sum => <CallFunction fn={() => { |
| 46 | + prevResult.current = result; |
| 47 | + setResult(numberToNode(sum)); |
| 48 | + }} />} |
47 | 49 | </CallElement>
|
48 |
| - <></> |
49 | 50 | </IfElse>
|
50 | 51 | </>
|
51 | 52 | );
|
52 |
| -}; |
| 53 | +}); |
53 | 54 |
|
54 | 55 | const App: FC = () => {
|
55 | 56 | return (
|
56 |
| - <> |
| 57 | + <div> |
57 | 58 | <div>
|
58 |
| - <CallElement fn={<Multiply a={<><Two /><One /></>} b={<Two />} />}> |
59 |
| - {(result) => <>3 * 2 = {result}</>} |
| 59 | + <CallElement fn={<Add> <N._5 /> <N._3 /> <N._4 /> </Add>}> |
| 60 | + {(result) => <>5 + 3 + 4 = {result}</>} |
60 | 61 | </CallElement>
|
61 | 62 | </div>
|
62 | 63 | <div>
|
63 |
| - <CallElement fn={<Add> <One /> <Two /> <Two /> </Add>}> |
64 |
| - {(result) => <>1 + 2 + 2 = {result}</>} |
| 64 | + <CallElement fn={<Multiply a={<><N._3 /><N._5 /></>} b={<N._3 />} />}> |
| 65 | + {(result) => <>8 * 3 = {result}</>} |
65 | 66 | </CallElement>
|
66 | 67 | </div>
|
67 | 68 | <div>
|
68 |
| - <CallElement fn={<Factorial n={10} />}> |
69 |
| - {(result) => <>Facto: {result}</>} |
| 69 | + <CallElement fn={<Factorial n={5} />}> |
| 70 | + {(result) => <>Factorial(5): {result}</>} |
70 | 71 | </CallElement>
|
71 | 72 | </div>
|
72 | 73 | <div>
|
73 |
| - <CallElement fn={<Fibonacci n={8} />}> |
74 |
| - {(result) => <>Fibo: {result}</>} |
| 74 | + <CallElement fn={<EvaluateAll fns={Array.from({ length: 10 }, (_, i) => <Fibonacci n={i} key={i} />)} />}> |
| 75 | + {(result) => <>Fibo: {result.join(', ')}</>} |
75 | 76 | </CallElement>
|
76 | 77 | </div>
|
77 |
| - </> |
| 78 | + </div> |
78 | 79 | );
|
79 | 80 | };
|
80 | 81 |
|
|
0 commit comments