refactoring + added path key support in AT(..)...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2018-09-06 00:50:16 +03:00
parent 1094729e1f
commit a559ed7aeb
2 changed files with 50 additions and 30 deletions

22
diff.js
View File

@ -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

View File

@ -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...