Skip to content

Commit

Permalink
refactor(main): move all components inside main
Browse files Browse the repository at this point in the history
use funjector for dependency injection
  • Loading branch information
tusharmath committed Apr 4, 2016
1 parent 5f1ec36 commit cd22000
Show file tree
Hide file tree
Showing 11 changed files with 57 additions and 59 deletions.
10 changes: 0 additions & 10 deletions src/fetchBegin.js

This file was deleted.

4 changes: 0 additions & 4 deletions src/fetchEnd.js

This file was deleted.

7 changes: 0 additions & 7 deletions src/getHydratedRequests.js

This file was deleted.

12 changes: 0 additions & 12 deletions src/isHydrated.js

This file was deleted.

11 changes: 0 additions & 11 deletions src/isLoading.js

This file was deleted.

54 changes: 48 additions & 6 deletions src/main.js
Expand Up @@ -4,18 +4,60 @@
'use strict'

const Rx = require('rx')
const targs = require('argtoob')
const _ = require('funjector')

const e = module.exports = (e, fetch, request) => {
const observer = new Rx.Subject()
e.fetch(fetch, request, observer).subscribe(observer)
return observer
}

e.isHydrated = require('./isHydrated')
e.getHydratedRequests = require('./getHydratedRequests')
e.fetchEnd = require('./fetchEnd')
e.fetchBegin = require('./fetchBegin')
e.fetch = (fetch, request, observer) => Rx.Observable.merge(
e.fetchBegin(request, observer),
e.fetchEnd(fetch, observer)
e.fetchBegin(request, observer),
e.fetchEnd(fetch, observer)
)

e.isLoading = function () {
return Rx.Observable.merge(
Array.prototype.map.call(arguments, store => Rx
.Observable.merge(
store.filter(x => x.event === 'REQUEST').map(true),
store.filter(x => x.event === 'RESPONSE').map(false)
).share()
)
).distinctUntilChanged()
}

e.isHydrated = events => {
var hydrationCount = 0
const mount = events.filter(x => x.event === 'WILL_MOUNT').map(1)
const unmount = events.filter(x => x.event === 'WILL_UNMOUNT').map(-1)
return Rx.Observable
.merge(mount, unmount).startWith(0)
.tap(x => hydrationCount += x)
.map(() => hydrationCount > 0)
.distinctUntilChanged()
}

e.getHydratedRequests = _.partial((isHydrated, request, com) => request
.combineLatest(isHydrated(com), targs('request', 'isHydrated'))
.filter(x => x.isHydrated)
.pluck('request'),
e.isHydrated
)

e.fetchBegin = _.partial((getHydratedRequests, req, com) => {
const reload = com
.filter(x => x.event === 'RELOAD')
.startWith(null)

return getHydratedRequests(req, com)
.map(x => ({event: 'REQUEST', args: x}))
.combineLatest(reload, a => a)
}, e.getHydratedRequests)

e.fetchEnd = (fetch, com) => com
.filter(x => x.event === 'REQUEST')
.flatMap(x => fetch.apply(null, x.args))
.map(x => ({event: 'RESPONSE', args: [x]}))
2 changes: 1 addition & 1 deletion test/test.fetchBegin.js
@@ -1,5 +1,5 @@
import test from 'ava'
import e from '../src/fetchBegin'
import {fetchBegin as e} from '../src/main'
import { ReactiveTest, TestScheduler } from 'rx'
const {onNext} = ReactiveTest

Expand Down
4 changes: 2 additions & 2 deletions test/test.fetchEnd.js
@@ -1,6 +1,6 @@
import test from 'ava'
import e from '../src/fetchEnd'
import { ReactiveTest, TestScheduler } from 'rx'
import {fetchEnd as e} from '../src/main'
import {ReactiveTest, TestScheduler} from 'rx'
const {onNext} = ReactiveTest

test(t => {
Expand Down
4 changes: 2 additions & 2 deletions test/test.getHydratedRequests.js
@@ -1,6 +1,6 @@
import test from 'ava'
import e from '../src/getHydratedRequests'
import { ReactiveTest, TestScheduler } from 'rx'
import {getHydratedRequests as e} from '../src/main'
import {ReactiveTest, TestScheduler} from 'rx'
const {onNext} = ReactiveTest

test(t => {
Expand Down
4 changes: 2 additions & 2 deletions test/test.isHydrated.js
@@ -1,6 +1,6 @@
import f from '../src/isHydrated'
import {isHydrated as f} from '../src/main'
import test from 'ava'
import { ReactiveTest, TestScheduler } from 'rx'
import {ReactiveTest, TestScheduler} from 'rx'
const {onNext} = ReactiveTest

test(t => {
Expand Down
4 changes: 2 additions & 2 deletions test/test.isLoading.js
@@ -1,6 +1,6 @@
import f from '../src/isLoading'
import {isLoading as f} from '../src/main'
import test from 'ava'
import { ReactiveTest, TestScheduler } from 'rx'
import {ReactiveTest, TestScheduler} from 'rx'
const {onNext} = ReactiveTest

test(t => {
Expand Down

0 comments on commit cd22000

Please sign in to comment.