added experimental diff format pattern + minor fixes...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2018-09-02 03:32:27 +03:00
parent e136912edc
commit 04320742ad
2 changed files with 119 additions and 4 deletions

34
diff.js
View File

@ -275,7 +275,8 @@ var LogicTypePrototype = {
} }
var res = this.__cmp__(obj, cmp, cache) var res = this.__cmp__(obj, cmp, cache)
|| (obj.__cmp__ || (obj != null
&& obj.__cmp__
&& obj.__cmp__(this, cmp, cache)) && obj.__cmp__(this, cmp, cache))
c.set(obj, res) c.set(obj, res)
@ -307,12 +308,38 @@ var makeCIPattern = function(name, check, init){
// ANY // ANY
// -> pattern // -> pattern
// //
// XXX AT('moo', ANY) matches L even if 'moo' in L is false...
var ANY = var ANY =
module.ANY = module.ANY =
makeCIPattern('ANY', makeCIPattern('ANY',
function(){ return true })() function(){ return true })()
// Bool pattern...
//
// BOOL
// -> pattern
//
var BOOL =
module.BOOL =
makeCIPattern('BOOL',
function(obj){
return obj === true || obj === false })()
// Function pattern...
//
// FUNCTION
// -> pattern
//
// XXX add signature checking...
var FUNCTION =
module.FUNCTION =
makeCIPattern('FUNCTION',
function(obj){
return obj instanceof Function })()
// String pattern... // String pattern...
// //
// STRING // STRING
@ -408,7 +435,7 @@ module.ARRAY =
|| (obj instanceof Array || (obj instanceof Array
// XXX make this fail on first fail -- currently // XXX make this fail on first fail -- currently
// this runs every test on every elem... // this runs every test on every elem...
&& this.value.filter(function(value){ && (this.value || []).filter(function(value){
return (typeof(value) == typeof(123) ? return (typeof(value) == typeof(123) ?
obj.length == value obj.length == value
// function... // function...
@ -418,7 +445,7 @@ module.ARRAY =
: obj.filter(function(e){ : obj.filter(function(e){
return cmp(value, e) return cmp(value, e)
}).length == obj.length) }).length == obj.length)
}).length == this.value.length) }, }).length == (this.value || []).length) },
function(...value){ this.value = value }) function(...value){ this.value = value })
@ -873,7 +900,6 @@ module.Types = {
var typeB = this.detect(B, undefined, options) var typeB = this.detect(B, undefined, options)
// type match... // type match...
//if(type === typeB){
if(type === typeB && this.has(type)){ if(type === typeB && this.has(type)){
return type return type

89
format.js Normal file
View File

@ -0,0 +1,89 @@
/**********************************************************************
*
*
*
**********************************************************************/
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
(function(require){ var module={} // make module AMD/node compatible...
/*********************************************************************/
var diff = require('./diff')
var {
ANY,
BOOL, NUMBER, STRING, ARRAY, FUNCTION,
OR, AND, NOT,
AT, OF, IN,
EMPTY, NONE,
} = diff
/*********************************************************************/
// XXX need better mismatch checking -- ideally stating the exact spot
// where we did not match...
//
var VALUE =
module.VALUE = OR(
EMPTY,
NONE,
ANY)
var CHANGE =
module.CHANGE = AND(
AT('path', ARRAY),
// XXX optional...
// ...see DIFF_OBJECT's options for description...
AT('type', OR(STRING, undefined)),
OR(
// A ans B...
AND(
AT('A', VALUE),
AT('B', VALUE)),
// only A...
AT('A', VALUE),
// only B...
AT('B', VALUE)))
var DIFF_FORMAT_FLAT =
module.DIFF_FORMAT_FLAT = ARRAY(CHANGE)
// XXX
var DIFF_FORMAT_TREE =
module.DIFF_FORMAT_TREE = ANY
var DIFF_OBJECT =
module.DIFF_OBJECT = AND(
AT('format', diff.FORMAT_NAME),
//AT('version', STRING(/\d+\.\d+\.\d+/)),
AT('placeholders', AND(
// XXX must be unique ANY...
AT('NONE', ANY),
AT('EMPTY', ANY))),
AT('options', AND(
AT('tree_diff', OR(BOOL, null)),
AT('keep_none', OR(BOOL, null)),
AT('min_text_length', OR(NUMBER, null)),
AT('no_attributes', OR(BOOL, null)),
AT('NONE', OR(ANY, null)),
AT('EMPTY', OR(ANY, null)),
AT('no_length', OR(BOOL, null)),
AT('cmp', OR(FUNCTION, null)) )),
AT('timestamp', NUMBER),
OR(
AND(
AT('structure', 'flat'),
AT('diff', DIFF_FORMAT_FLAT)),
AND(
AT('structure', 'tree'),
AT('diff', DIFF_FORMAT_TREE))) )
/**********************************************************************
* vim:set ts=4 sw=4 : */ return module })