mirror of
https://github.com/flynx/diff.js.git
synced 2025-10-29 11:00:12 +00:00
refactoring + added path key support in AT(..)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
1094729e1f
commit
a559ed7aeb
22
diff.js
22
diff.js
@ -694,20 +694,36 @@ object.makeConstructor('IN', Object.assign(Object.create(LogicType.prototype), {
|
|||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
// AT(A, K) == L iff A in L and L[K] == A
|
// AT(A, K) == L iff A in L and L[K] == A
|
||||||
|
//
|
||||||
|
// NOTE: this also supports path keys -- i.e. array of path elements that
|
||||||
|
// will be traversed and the last one checked...
|
||||||
|
// NOTE: to include an array as an explicit key (Map/...) wrap it in
|
||||||
|
// an array:
|
||||||
|
// AT([[123]], ...)
|
||||||
|
//
|
||||||
// XXX .key can't be a pattern at this point...
|
// XXX .key can't be a pattern at this point...
|
||||||
// XXX this is a potential problem as with a pattern key we would need to
|
// ...to implement this we would need to do:
|
||||||
// look ahead to pick the correct candidate...
|
// 1) a search for a matching pattern...
|
||||||
|
// 2) handle multiple matches in some manner (first, all?)...
|
||||||
// XXX this falls into recursion on:
|
// XXX this falls into recursion on:
|
||||||
// X = AT('moo')
|
// X = AT('moo')
|
||||||
// X.value = OR(123, X)
|
// X.value = OR(123, X)
|
||||||
// cmp(X, {'moo', 333})
|
// cmp(X, {'moo', 333})
|
||||||
// ...this would also break on checking a recursive structure against
|
// ...this would also break on checking a recursive structure against
|
||||||
// a recursive pattern...
|
// a recursive pattern...
|
||||||
|
// XXX support Maps, ...
|
||||||
var AT =
|
var AT =
|
||||||
module.AT =
|
module.AT =
|
||||||
object.makeConstructor('AT', Object.assign(Object.create(LogicType.prototype), {
|
object.makeConstructor('AT', Object.assign(Object.create(LogicType.prototype), {
|
||||||
__cmp__: function(obj, cmp, context){
|
__cmp__: function(obj, cmp, context){
|
||||||
if(cmp(obj != null ? obj[this.key] : null, this.value, context)){
|
var key = this.key instanceof Array ? this.key : [this.key]
|
||||||
|
var no_result = {}
|
||||||
|
obj = key
|
||||||
|
.reduce(function(o, k){
|
||||||
|
return (o == null || o === no_result) ?
|
||||||
|
no_result
|
||||||
|
: o[k] }, obj)
|
||||||
|
if(obj !== no_result && cmp(obj, this.value, context)){
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|||||||
58
format.js
58
format.js
@ -34,9 +34,8 @@ var {
|
|||||||
|
|
||||||
var VALUE =
|
var VALUE =
|
||||||
module.VALUE = OR(
|
module.VALUE = OR(
|
||||||
// XXX use these taken from .placeholders...
|
OR(LIKE('EMPTY'), EMPTY),
|
||||||
OR(EMPTY, LIKE('EMPTY')),
|
OR(LIKE('NONE'), NONE),
|
||||||
OR(NONE, LIKE('NONE')),
|
|
||||||
ANY)
|
ANY)
|
||||||
|
|
||||||
|
|
||||||
@ -54,8 +53,6 @@ module.SIDE_VALUES = OR(
|
|||||||
var CHANGE =
|
var CHANGE =
|
||||||
module.CHANGE = AND(
|
module.CHANGE = AND(
|
||||||
AT('path', L),
|
AT('path', L),
|
||||||
// XXX optional...
|
|
||||||
// ...see DIFF_OBJECT's options for description...
|
|
||||||
AT('type', OR(S, undefined)),
|
AT('type', OR(S, undefined)),
|
||||||
SIDE_VALUES)
|
SIDE_VALUES)
|
||||||
|
|
||||||
@ -69,6 +66,7 @@ module.DIFF_FLAT = OR(
|
|||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// Tree diff...
|
// Tree diff...
|
||||||
|
|
||||||
|
// Basic...
|
||||||
var BASIC_CHANGE =
|
var BASIC_CHANGE =
|
||||||
module.BASIC_CHANGE = AND(
|
module.BASIC_CHANGE = AND(
|
||||||
AT('type', 'Basic'),
|
AT('type', 'Basic'),
|
||||||
@ -76,6 +74,7 @@ module.BASIC_CHANGE = AND(
|
|||||||
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
// Object...
|
||||||
var OBJECT_ITEM =
|
var OBJECT_ITEM =
|
||||||
module.OBJECT_ITEM = OR(
|
module.OBJECT_ITEM = OR(
|
||||||
[S, DIFF_TREE],
|
[S, DIFF_TREE],
|
||||||
@ -90,6 +89,7 @@ module.OBJECT_CHANGE = AND(
|
|||||||
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
// Array...
|
||||||
var ARRAY_ITEM =
|
var ARRAY_ITEM =
|
||||||
module.ARRAY_ITEM = OR(
|
module.ARRAY_ITEM = OR(
|
||||||
[ANY, ANY, DIFF_TREE],
|
[ANY, ANY, DIFF_TREE],
|
||||||
@ -100,8 +100,8 @@ module.ARRAY_ITEMS = AND(
|
|||||||
AT('length', OR(
|
AT('length', OR(
|
||||||
[N, N],
|
[N, N],
|
||||||
undefined)),
|
undefined)),
|
||||||
AT('items', L(
|
AT('items',
|
||||||
OR(
|
L(OR(
|
||||||
ARRAY_ITEM,
|
ARRAY_ITEM,
|
||||||
OBJECT_ITEM))),
|
OBJECT_ITEM))),
|
||||||
// XXX
|
// XXX
|
||||||
@ -109,18 +109,20 @@ module.ARRAY_ITEMS = AND(
|
|||||||
|
|
||||||
var ARRAY_CHANGE =
|
var ARRAY_CHANGE =
|
||||||
module.ARRAY_CHANGE = AND(
|
module.ARRAY_CHANGE = AND(
|
||||||
AT('type', 'Array'),
|
AT('type', 'Array'),
|
||||||
ARRAY_ITEMS)
|
ARRAY_ITEMS)
|
||||||
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
// Text...
|
||||||
var TEXT_CHANGE =
|
var TEXT_CHANGE =
|
||||||
module.TEXT_CHANGE = AND(
|
module.TEXT_CHANGE = AND(
|
||||||
AT('type', 'Text'),
|
AT('type', 'Text'),
|
||||||
ARRAY_ITEMS)
|
ARRAY_ITEMS)
|
||||||
|
|
||||||
// XXX it makes sense to make this a recursive pattern...
|
|
||||||
// ...need to check if we stop on a recursive pattern...
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
// XXX need to check if we stop on a recursive pattern...
|
||||||
// XXX TEST!!!
|
// XXX TEST!!!
|
||||||
var DIFF_TREE =
|
var DIFF_TREE =
|
||||||
module.DIFF_TREE = OR(
|
module.DIFF_TREE = OR(
|
||||||
@ -142,20 +144,22 @@ module.DIFF_OBJECT = AND(
|
|||||||
AT('version', diff.FORMAT_VERSION),
|
AT('version', diff.FORMAT_VERSION),
|
||||||
|
|
||||||
// instance metadata...
|
// instance metadata...
|
||||||
AT('options', AND(
|
AT('options',
|
||||||
AT('tree_diff', OR(B, NULL)),
|
AND(
|
||||||
AT('keep_none', OR(B, NULL)),
|
AT('tree_diff', OR(B, NULL)),
|
||||||
AT('min_text_length', OR(N, NULL)),
|
AT('keep_none', OR(B, NULL)),
|
||||||
AT('no_attributes', OR(B, NULL)),
|
AT('min_text_length', OR(N, NULL)),
|
||||||
AT('NONE', OR(ANY, NULL)),
|
AT('no_attributes', OR(B, NULL)),
|
||||||
AT('EMPTY', OR(ANY, NULL)),
|
AT('NONE', OR(ANY, NULL)),
|
||||||
AT('no_length', OR(B, NULL)),
|
AT('EMPTY', OR(ANY, NULL)),
|
||||||
AT('cmp', OR(F, NULL)) )),
|
AT('no_length', OR(B, NULL)),
|
||||||
AT('placeholders', AND(
|
AT('cmp', OR(F, NULL)) )),
|
||||||
AT('NONE',
|
AT('placeholders',
|
||||||
VAR('NONE', ANY)),
|
AND(
|
||||||
AT('EMPTY',
|
AT('NONE',
|
||||||
VAR('EMPTY', ANY)))),
|
VAR('NONE', ANY)),
|
||||||
|
AT('EMPTY',
|
||||||
|
VAR('EMPTY', ANY)))),
|
||||||
AT('timestamp', N),
|
AT('timestamp', N),
|
||||||
|
|
||||||
// diff...
|
// diff...
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user