diff --git a/flowtype.md b/flowtype.md index 1d4df6444..756396bfc 100644 --- a/flowtype.md +++ b/flowtype.md @@ -119,6 +119,7 @@ function filter (list: Array, callback: (item: T) => boolean): Array { ```js import type { Person } from '../person' +import typeof Config from '../config' ``` ```js @@ -142,3 +143,26 @@ var add: ((num1: number, num2: number) => number) = function(num1, num2) { return num1 + num2; }; ``` + +## Comment syntax + +```js +/*:: + export type Foo = { ... } +*/ + +function add(n /*: number */) { ... } +``` + +## React + +```js +React$Element +``` + +```js +class Foo extends React.Component { + /*:: state: { open: boolean } */ + /*:: props: { open: boolean } */ +} +``` diff --git a/nodejs-stream.md b/nodejs-stream.md new file mode 100644 index 000000000..f23cb4903 --- /dev/null +++ b/nodejs-stream.md @@ -0,0 +1,83 @@ +--- +title: Stream +category: Node.js +--- + +```js +const Readable = require('stream').Readable +const Writable = require('stream').Writable +const Transform = require('stream').Transform +``` + +### Piping + +```js +clock() // Readable stream + .pipe(xformer()) // Transform stream + .pipe(renderer()) // Writable stream +``` + +### Readable streams + +Readable streams are generators of data. Write data using `stream.push()`. + +```js +function clock () { + const stream = new Readable({ + objectMode: true, + read: () => {} // implement this if you need on-demand reading + }) + + setInterval(() => { + stream.push({ time: new Date() }) + + if (error) return stream.emit('error', error) + if (eof) return stream.push(null) + }, 1000) + + return stream +} +``` + +### Transform streams + +Pass the updated chunk to `done(null, chunk)`. + +```js +function xformer () { + let count = 0 + + return new Transform({ + objectMode: true, + transform: (data, _, done) => { + done(null, { time: data.time, index: count++ }) + } + }) +} +``` + +### Writable streams + +```js +function renderer () { + return new Writable({ + objectMode: true, + write: (data, _, done) => { + console.log('<-', data) + done() + } + }) +} +``` + +### Reading + +```js +const st = source() +st.on('data', (data) => { console.log('<-', data) }) +st.on('close', () => { console.log('** bye') }) +``` + +## Also see + +- diff --git a/rails-models.md b/rails-models.md index c1aa09e55..3ac3e5458 100644 --- a/rails-models.md +++ b/rails-models.md @@ -348,9 +348,18 @@ Other API ### Joining - Student.joins(:schools).where(:schools => { :type => 'public' }) + Student.joins(:schools).where(schools: { type: 'public' }) Student.joins(:schools).where('schools.type' => 'public' ) + # multiple associations + Article.joins(:category, :comments) + + # nested assocations + Article.joins(comments: :guest) + + # sql + Author.joins("INNER JOIN posts ON posts.author_id = authors.id AND posts.published = 't'") + ### Where interpolation where("name = ?", "John") diff --git a/rspec.md b/rspec.md index 44afa2391..9c4301f6b 100644 --- a/rspec.md +++ b/rspec.md @@ -148,6 +148,7 @@ book = instance_double('Book', pages: 250) ```rb allow(die).to receive(:roll) allow(die).to receive(:roll) { 3 } +allow_any_instance_of(Die).to receive(:roll) expect(die).to receive(:roll) .with(1)