Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Также я стараюсь делать Kefir максимально простым для изучения, примерно как Underscore или LoDash.Это здорово, API Бекона и Rx какие-то неэлегантные. Было бы круто иметь FRP с API в духе Underscore/LoDash.
config = Kefir.constant( false )
coords = Kefir.constant( [0,0] )
printer = Kefir.merge([ config, coords ]).scan( 0, functon( config, coords ){
return 'Hello' + ( config ? coords : '' )
})
.scan первый аргумент — предыдущее значение, а второй новое значение из источника, и вы должны вернуть значение которое выйдет из printer и станет «предыдущим значением» на следующем шаге. А .merge просто берет два потока и все события из них отправляет в новый поток. Ну т.е. вы никак не получите config и coords как параметры в .scan.printer = Kefir.combine([config, coords], function(config, coords) {
return 'Hello' + ( config ? coords : '' )
});
printer = coords.filterBy(config).map(function(coords) {
return 'Hello' + coords
});
.filterBy он как .filter, только вместо функции принимает проперти или поток.printer = Kefir.combine([ config, mouseCoords, mouseTarget ], function( config, coords, target ) {
return 'Hello ' + ( config ? coords : target )
});
printer = config.flatMapLatest(function(config) {
// возвращаем поток. Т.е. как бы переключаемся с потока на поток в зависимости от config
return config ? mouseCoords : mouseTarget;
}).map(function (coordsOrTarget) {
// тут уже обрабатываем конкретные значения из mouseCoords или mouseTarget
return 'Hello ' + coordsOrTarget;
});
printer = config.flatMapLatest( function(config) {
if( config ){
return mouseCoords.map( function( coords ){
return 'Mouse coords is ' + coords
}
} else {
return mouseTarget.map( function( target ){
return 'Mouse target is ' + target
}
}
} )
Kefir.js — новая библиотека для функционального реактивного программирования (FRP) в JavaScript