11import * as React from 'react' ;
22import { render } from 'react-dom' ;
33import '../../../../../src/xs/rx'
4- import { Applicative , lift2 , Semigroup , Functor , map , Traversable } from '../../../../../src/fantasy'
5- import { X } from '../../../../../src'
4+ import { Applicative , lift2 , Semigroup , Functor , map , Traversable , FlatMap } from '../../../../../src/fantasy'
5+ import { X } from '../../../../../src'
66function xmount ( component , dom ) { render ( React . createFactory ( X ) ( { } , component ) , dom ) }
77
8- let mult = ( x : number , y : number ) => x * y
9- let Xeg1 = lift2 < "FantasyX" , number , number , number > ( mult ) ( Applicative . FantasyX . pure ( 6 ) , Applicative . FantasyX . pure ( 5 ) )
8+ let mult = ( x :number , y : number ) => x * y
9+ let Xeg1 = lift2 < "FantasyX" , number , number , number > ( mult ) ( Applicative . FantasyX . pure ( 6 ) , Applicative . FantasyX . pure ( 5 ) )
1010
1111let ViewEg1 = props => < p className = "result" > { props . product } </ p >
1212
13- let Eg1 = Functor . FantasyX . map ( a => ( { product : a } ) , Xeg1 ) . apply ( ViewEg1 )
13+ let Eg1 = Functor . FantasyX . map ( a => ( { product : a } ) , Xeg1 ) . apply ( ViewEg1 )
1414
15- xmount ( < Eg1 /> , document . getElementById ( 'eg1' ) )
15+ xmount ( < Eg1 /> , document . getElementById ( 'eg1' ) )
1616
17- import { Xstream } from '../../../../../src/fantasy/xstream' ;
17+ import { Xstream } from '../../../../../src/fantasy/xstream' ;
1818
19- function strToInt ( x ) { return ~ ~ x }
20- type Intent = { type : string , value : number }
19+ function strToInt ( x ) { return ~ ~ x }
20+ type Intent = { type :string , value :number }
2121let XSinput1 = Xstream . fromEvent ( 'change' , 'n1' , '5' )
2222let XSinput2 = Xstream . fromEvent ( 'change' , 'n2' , '6' )
2323
2424let Xeg2 = lift2 < "Xstream" , number , number , number > ( mult ) (
25- Functor . Xstream . map ( strToInt , XSinput1 ) ,
26- Functor . Xstream . map ( strToInt , XSinput2 )
25+ Functor . Xstream . map ( strToInt , XSinput1 ) ,
26+ Functor . Xstream . map ( strToInt , XSinput2 )
2727) . toFantasyX ( )
28- . map ( x => ( { product : x } ) )
28+ . map ( x => ( { product : x } ) )
2929
3030let ViewEg2 = props => < section >
31- < p > < input type = "number" name = "n1" onChange = { props . actions . fromEvent } defaultValue = "5" /> </ p >
32- < p > < input type = "number" name = "n2" onChange = { props . actions . fromEvent } defaultValue = "6" /> </ p >
31+ < p > < input type = "number" name = "n1" onChange = { props . actions . fromEvent } defaultValue = "5" /> </ p >
32+ < p > < input type = "number" name = "n2" onChange = { props . actions . fromEvent } defaultValue = "6" /> </ p >
3333 < p > < span className = "result" > { props . product } </ span > </ p >
34- </ section >
34+ </ section >
3535
3636let Eg2 = Xeg2 . apply ( ViewEg2 )
3737
38- xmount ( < Eg2 /> , document . getElementById ( 'eg2' ) )
38+ xmount ( < Eg2 /> , document . getElementById ( 'eg2' ) )
3939
4040let Xeg3 = Semigroup . Xstream . concat (
41- Semigroup . Xstream . concat (
42- Xstream . fromEvent ( 'change' , 'firstName' , 'Jichao' ) ,
43- Applicative . Xstream . pure ( ' ' )
44- ) ,
45- Xstream . fromEvent ( 'change' , 'lastName' , 'Ouyang' )
41+ Semigroup . Xstream . concat (
42+ Xstream . fromEvent ( 'change' , 'firstName' , 'Jichao' ) ,
43+ Applicative . Xstream . pure ( ' ' )
44+ ) ,
45+ Xstream . fromEvent ( 'change' , 'lastName' , 'Ouyang' )
4646) . toFantasyX ( )
4747let ViewEg3 = props => < section >
4848 < p > < input type = "text" name = "firstName" onChange = { props . actions . fromEvent } defaultValue = "Jichao" /> </ p >
49- < p > < input type = "text" name = "lastName" onChange = { props . actions . fromEvent } defaultValue = "Ouyang" /> </ p >
49+ < p > < input type = "text" name = "lastName" onChange = { props . actions . fromEvent } defaultValue = "Ouyang" /> </ p >
5050 < p > < span className = "result" > { props . semigroup } </ span > </ p >
51- </ section >
51+ </ section >
5252
53- let Eg3 = Xeg3 . map ( a => ( { semigroup : a } ) ) . apply ( ViewEg3 )
53+ let Eg3 = Xeg3 . map ( a => ( { semigroup : a } ) ) . apply ( ViewEg3 )
5454
55- xmount ( < Eg3 /> , document . getElementById ( 'eg3' ) )
55+ xmount ( < Eg3 /> , document . getElementById ( 'eg3' ) )
5656
57- function sum ( list ) {
58- return list . reduce ( ( acc , x ) => acc + x , 0 )
57+ function sum ( list ) {
58+ return list . reduce ( ( acc , x ) => acc + x , 0 )
5959}
6060let list = [ '1' , '2' , '3' , '4' , '5' , '6' , '7' ]
6161let Xeg4 = Traversable . Array . traverse < 'Xstream' , string , string > ( 'Xstream' ) (
@@ -66,13 +66,44 @@ let Xeg4 = Traversable.Array.traverse<'Xstream', string, string>('Xstream')(
6666 . map ( sum )
6767
6868let ViewEg4 = props => < section >
69- { list . map ( ( item , index ) => ( < p >
70- < input key = { index } type = "number" name = { "traverse" + index } onChange = { props . actions . fromEvent } defaultValue = { item } />
71- </ p > ) )
72- }
73- < p > < span className = "result" > { props . sum } </ span > </ p >
69+ { list . map ( ( item , index ) => ( < p >
70+ < input key = { index } type = "number" name = { "traverse" + index } onChange = { props . actions . fromEvent } defaultValue = { item } />
71+ </ p > ) )
72+ }
73+ < p > < span className = "result" > { props . sum } </ span > </ p >
7474</ section >
7575
76- let Eg4 = Xeg4 . map ( a => ( { sum : a } ) ) . apply ( ViewEg4 )
76+ let Eg4 = Xeg4 . map ( a => ( { sum : a } ) ) . apply ( ViewEg4 )
77+
78+ xmount ( < Eg4 /> , document . getElementById ( 'eg4' ) )
79+
80+ function bmiCalc ( weight , height ) {
81+ return fetch ( `https://gist.github.com.ru/jcouyang/edc3d175769e893b39e6c5be12a8526f?height=${ height } &weight=${ weight } ` )
82+ . then ( resp => resp . json ( ) )
83+ . then ( json => json . result )
84+ }
85+
86+ let promiseXstream = lift2 < "Xstream" , string , string , Promise < any > > ( bmiCalc ) (
87+ Xstream . fromEvent ( 'change' , 'weight' , '70' ) ,
88+ Xstream . fromEvent ( 'change' , 'height' , '175' )
89+ )
90+
91+ let Xeg5 = FlatMap . Xstream . flatMap ( Xstream . fromPromise , promiseXstream )
92+ . toFantasyX ( )
93+
94+ let ViewEg5 = props => (
95+ < div >
96+ < label > Height: { props . height } cm
97+ < input type = "range" name = "height" onChange = { props . actions . fromEvent } min = "150" max = "200" defaultValue = { props . height } />
98+ </ label >
99+ < label > Weight: { props . weight } kg
100+ < input type = "range" name = "weight" onChange = { props . actions . fromEvent } min = "40" max = "100" defaultValue = { props . weight } />
101+ </ label >
102+ < p > HEALTH: < span > { props . health } </ span > </ p >
103+ < p > BMI: < span className = "result" > { props . bmi } </ span > </ p >
104+ </ div >
105+ )
106+
107+ let Eg5 = Xeg5 . apply ( ViewEg5 )
77108
78- xmount ( < Eg4 /> , document . getElementById ( 'eg4' ) )
109+ xmount ( < Eg5 /> , document . getElementById ( 'eg5' ) )
0 commit comments