Skip to content

Commit

Permalink
refactor: serialize ruleIndex in records
Browse files Browse the repository at this point in the history
  • Loading branch information
doodlewind committed Dec 13, 2018
1 parent c29a36e commit 930775c
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 16 deletions.
2 changes: 1 addition & 1 deletion src/history.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export class History {
} else if (!this.useChunks) {
resultState = currentRecord
} else {
resultState = record2State(currentRecord, this.$chunks)
resultState = record2State(currentRecord, this.$chunks, this.rules)
}
this.onChange(resultState)
return resultState
Expand Down
21 changes: 12 additions & 9 deletions src/transform.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ const defaultRule = {
export const state2Record = (
stateNode, chunkPool, rules = [], prevRecord = null, pickIndex = -1
) => {
const rule = rules.find(({ match }) => match(stateNode)) || defaultRule
const { toRecord } = rule
const ruleIndex = rules.findIndex(({ match }) => match(stateNode))
const rule = (rules[ruleIndex] || defaultRule)

const { chunks, children } = toRecord(stateNode)
const { chunks, children } = rule.toRecord(stateNode)
const recordChildren = children
const hashes = []
for (let i = 0; i < chunks.length; i++) {
Expand All @@ -30,22 +30,25 @@ export const state2Record = (
childrenCopy[pickIndex] = state2Record(
recordChildren[pickIndex], chunkPool, rules
)
return { hashes, rule, children: childrenCopy }
return { hashes, ruleIndex, children: childrenCopy }
} else {
return {
hashes,
rule,
ruleIndex,
children: children &&
children.map(node => state2Record(node, chunkPool, rules))
}
}
}

export const record2State = (recordNode, chunkPool) => {
const { hashes, rule: { fromRecord }, children } = recordNode
export const record2State = (recordNode, chunkPool, rules = []) => {
const { hashes, ruleIndex, children } = recordNode
const chunks = hashes.map(hash => JSON.parse(chunkPool[hash]))
return fromRecord({
const rule = (rules[ruleIndex] || defaultRule)
return rule.fromRecord({
chunks,
children: children && children.map(node => record2State(node, chunkPool))
children: children && children.map(
node => record2State(node, chunkPool, rules)
)
})
}
12 changes: 6 additions & 6 deletions src/transform.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ test('custom match children props', () => {
]
}

const rule = {
const rules = [{
match: () => true,
toRecord: node => ({
chunks: [{ ...node, elements: undefined }],
Expand All @@ -74,11 +74,11 @@ test('custom match children props', () => {
...chunks[0],
elements: children
})
}
}]

const chunks = {}
const record = state2Record(state, chunks, [rule])
const resultState = record2State(record, chunks)
const record = state2Record(state, chunks, rules)
const resultState = record2State(record, chunks, rules)
expect(resultState).toEqual(state)
})

Expand Down Expand Up @@ -108,7 +108,7 @@ test('support node splitting', () => {

const chunks = {}
const record = state2Record(state, chunks, [rule])
const resultState = record2State(record, chunks)
const resultState = record2State(record, chunks, [rule])
expect(resultState).toEqual(state)
expect(Object.keys(chunks).length).toEqual(1 + 3 * 2) // root + 2 * leaves
})
Expand Down Expand Up @@ -153,7 +153,7 @@ test('support multi rules', () => {

const chunks = {}
const record = state2Record(state, chunks, rules)
const resultState = record2State(record, chunks)
const resultState = record2State(record, chunks, rules)
expect(resultState).toEqual(state)
})

Expand Down

0 comments on commit 930775c

Please sign in to comment.