lots of fixes and tweaks...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2018-09-05 02:58:15 +03:00
parent 9e400a7b8c
commit a4a525b84a
2 changed files with 49 additions and 12 deletions

43
diff.js
View File

@ -297,20 +297,37 @@ var LogicTypePrototype = {
__cmp__: function(obj, cmp, context){ __cmp__: function(obj, cmp, context){
return false }, return false },
//
// Deep compare this to obj (use Diff.cmp(..))...
// .cmp(obj)
// -> bool
//
// Deep compare this to obj in context (use Diff.cmp(..))...
// .cmp(obj, context)
// -> bool
//
// Compare this to obj using comparator cmp and an optional context context...
// .cmp(obj, cmp)
// .cmp(obj, cmp, context)
// -> bool
//
// XXX need to track loops... // XXX need to track loops...
// XXX HACK???: this uses Diff.cmp(..) in simple cases...
cmp: function(obj, cmp, context){ cmp: function(obj, cmp, context){
// XXX HACK??? // XXX HACK???
if(arguments.length < 3){ if(arguments.length < 3 || !(cmp instanceof Function)){
return Diff.cmp( return Diff.cmp(
cmp instanceof Function ? this : this.context(cmp), cmp instanceof Function ? this : this.context(cmp),
obj) obj)
} }
/*
cmp = cmp || function(a, b){ cmp = cmp || function(a, b){
return a === b return a === b
//|| a == b //|| a == b
|| (a.__cmp__ && a.__cmp__(b, cmp, context)) || (a.__cmp__ && a.__cmp__(b, cmp, context))
|| (b.__cmp__ && b.__cmp__(a, cmp, context)) } || (b.__cmp__ && b.__cmp__(a, cmp, context)) }
//*/
context = context || this.context().__context__ context = context || this.context().__context__
// cache... // cache...
@ -365,6 +382,22 @@ module.ANY =
function(){ return true })() function(){ return true })()
// Null type pattern...
//
// NULL
// -> pattern
//
// This matches null and undefined.
//
// NOTE: this will not match NaN (XXX revise)
var NULL =
module.NULL =
makeCIPattern('NULL',
function(obj){
return obj === null
|| obj === undefined })()
// Bool pattern... // Bool pattern...
// //
// BOOL // BOOL
@ -547,6 +580,7 @@ object.makeConstructor('AND', Object.assign(new LogicType(), {
}, },
})) }))
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// XXX BUG: // XXX BUG:
// CONTEXT([ANY, ANY, ANY]).cmp([1, 2, 3]) // CONTEXT([ANY, ANY, ANY]).cmp([1, 2, 3])
@ -602,6 +636,7 @@ object.makeConstructor('LIKE', Object.assign(new VAR(), {
obj) }, obj) },
})) }))
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// TEST(func) == L iff func(L) is true. // TEST(func) == L iff func(L) is true.
var TEST = var TEST =
@ -614,6 +649,7 @@ object.makeConstructor('TEST', Object.assign(new VAR(), {
} }
})) }))
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// IN(A) == L iff A in L // IN(A) == L iff A in L
// //
@ -1266,8 +1302,9 @@ module.Types = {
// basic compare... // basic compare...
// XXX do we need to differentiate things like: new Number(123) vs. 123??? // XXX do we need to differentiate things like: new Number(123) vs. 123???
var bcmp = function(a, b, cmp){ var bcmp = function(a, b, cmp){
// NOTE: we can't use a == b directly because of things like
// [2] == 2 -> true...
return a === b return a === b
//|| a == b
// basic patters... // basic patters...
|| a === that.ANY || a === that.ANY
|| b === that.ANY || b === that.ANY
@ -1677,7 +1714,7 @@ Types.set('Basic', {
no_attributes: true, no_attributes: true,
compatible: function(obj, options){ compatible: function(obj, options){
return typeof(obj) != 'object' }, return obj === null || typeof(obj) != 'object' },
handle: function(obj, diff, A, B, options){ handle: function(obj, diff, A, B, options){
;(!options.keep_none && A === NONE) ;(!options.keep_none && A === NONE)
|| (obj.A = A) || (obj.A = A)

View File

@ -13,7 +13,7 @@
var diff = require('./diff') var diff = require('./diff')
var { var {
ANY, ANY,
BOOL, NUMBER, STRING, ARRAY, FUNCTION, NULL, BOOL, NUMBER, STRING, ARRAY, FUNCTION,
OR, AND, NOT, OR, AND, NOT,
AT, OF, IN, AT, OF, IN,
VAR, LIKE, TEST, VAR, LIKE, TEST,
@ -144,14 +144,14 @@ module.DIFF_OBJECT = AND(
// instance metadata... // instance metadata...
AT('options', AND( AT('options', AND(
AT('tree_diff', OR(BOOL, null)), AT('tree_diff', OR(BOOL, NULL)),
AT('keep_none', OR(BOOL, null)), AT('keep_none', OR(BOOL, NULL)),
AT('min_text_length', OR(NUMBER, null)), AT('min_text_length', OR(NUMBER, NULL)),
AT('no_attributes', OR(BOOL, null)), AT('no_attributes', OR(BOOL, NULL)),
AT('NONE', OR(ANY, null)), AT('NONE', OR(ANY, NULL)),
AT('EMPTY', OR(ANY, null)), AT('EMPTY', OR(ANY, NULL)),
AT('no_length', OR(BOOL, null)), AT('no_length', OR(BOOL, NULL)),
AT('cmp', OR(FUNCTION, null)) )), AT('cmp', OR(FUNCTION, NULL)) )),
AT('placeholders', AND( AT('placeholders', AND(
// XXX would be nice to store these and to use them to test // XXX would be nice to store these and to use them to test
// deeper stuff (i.e. VALUE)... // deeper stuff (i.e. VALUE)...