@@ -6,68 +6,68 @@ import rest from 'rest'
66const remote = 'todos.json' ;
77import * as most from 'most'
88import Intent from '../todo.action'
9- const id = _ => _
10- const anyToId = ( ) => id
9+ import r from 'ramda'
10+ const anyToId = ( ) => r . identity
1111
1212const MainSection = ( { todos, filter} ) => {
1313 const completedCount = todos . reduce ( ( count , todo ) => todo . done ? count + 1 : count , 0 ) ;
14-
1514 const filteredTodos = filter ( todos ) ;
1615 return (
17- < section className = "main" >
18- < ul className = "todo-list" >
19- { filteredTodos . map ( todo =>
20- < TodoItem key = { todo . id } todo = { todo } />
21- ) }
22- </ ul >
23- < Footer completedCount = { completedCount } activeCount = { todos . length - completedCount } />
24- </ section >
16+ < section className = "main" >
17+ < ul className = "todo-list" >
18+ { filteredTodos . map ( ( todo , index ) =>
19+ < TodoItem key = { todo . id } index = { index } todo = { todo } />
20+ ) }
21+ </ ul >
22+ < Footer completedCount = { completedCount } activeCount = { todos . length - completedCount } />
23+ </ section >
2524 )
2625}
2726
2827MainSection . defaultProps = {
2928 todos : [
30- { id :0 , text :'Loading...dadada' , done :false } ,
29+ { id :0 , text :'Loading...dadada' , completed :false } ,
3130 ] ,
3231 filter : _ => _
3332}
3433
3534export default connect ( ( intent$ ) => {
36- let editSink$ = intent$ . map ( Intent . case ( {
37- Edit : todo => state => ( {
38- todos : state . todos . map ( oldtodo => todo . id == oldtodo . id ?todo :oldtodo )
39- } ) ,
35+ let lensTodos = r . lensProp ( 'todos' )
36+ let lensComplete = r . lensProp ( 'completed' )
37+ let lensTodo = index => r . compose ( lensTodos , r . lensIndex ( index ) )
38+ let lensTodoComplete = index => r . compose ( lensTodo ( index ) , lensComplete )
39+ let sinks$ = intent$ . map ( Intent . case ( {
40+ Edit : ( todo , index ) => r . set ( lensTodo ( index ) , todo ) ,
41+ Clear : ( ) => r . over ( lensTodos , r . filter ( todo => todo . completed ) ) ,
42+ Delete : id => r . over ( lensTodos , r . filter ( todo => todo . id != id ) ) ,
43+ Filter : filter => state => ( { filter } ) ,
44+ Done : index => r . over ( lensTodoComplete ( index ) , r . not ) ,
4045 _ :anyToId
41- } ) ) ;
42- let dataSink$ = most . fromPromise ( rest ( remote ) )
43- . map ( x => JSON . parse ( x . entity ) )
44- . map ( data => ( ) => ( { todos : data } ) ) ;
45-
46- let clearSink$ = intent$ . map ( Intent . case ( {
47- Clear : ( ) => state => ( {
48- todos : state . todos . filter ( todo => {
49- return ! todo . completed
50- } )
51- } ) ,
52- _ : anyToId
5346 } ) )
47+ let data$ = most . fromPromise ( rest ( remote ) )
48+ . map ( x => JSON . parse ( x . entity ) )
49+ . map ( data => ( ) => ( { todos : data } ) ) ;
5450
55- /* let searchSource$ = intent$.filter(i=>i.type=='search').debounce(500).map(x=>x.text.trim());
56-
57- * let blankSearchSink$ = searchSource$.filter(search=>!search).map(_=>_=>({filter:_.identity}));
58- * let searchSink$ = searchSource$.filter(search=>!!search).map(search=>state=>({
59- * filter: x=>x.filter(todo=>{
60- * return !!search.toLowerCase().split(' ').filter((word)=>{
61- * return !!todo.text.toLowerCase().split(' ').filter(w=>w==word).length
62- * }).length
63- * }) }));
51+ let searchSink$ = intent$
52+ . filter ( Intent . case ( {
53+ Search : x => ! ! x ,
54+ _ :( ) => false
55+ } ) )
56+ . debounce ( 500 )
57+ . map ( Intent . case ( {
58+ Search : x => x . text . trim ( )
59+ } ) )
60+ . map ( search => state => ( {
61+ filter : x => x . filter ( todo => {
62+ return ! ! search . toLowerCase ( ) . split ( ' ' ) . filter ( ( word ) => {
63+ return ! ! todo . text . toLowerCase ( ) . split ( ' ' ) . filter ( w => w == word ) . length
64+ } ) . length
65+ } )
66+ } ) )
6467
65- * let filterSink$ = intent$.filter(x=>x.type=='filter').map(intent=>state=>({
66- * filter: intent.filter
67- * }));*/
6868 return {
69- editSink $,
70- dataSink $,
71- clearSink $,
69+ sinks $,
70+ searchSink $,
71+ data $,
7272 }
7373} ) ( MainSection )
0 commit comments