Add tree class
This commit is contained in:
@@ -0,0 +1,221 @@
|
||||
'use strict'
|
||||
|
||||
class Event_Emitter
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor()
|
||||
{
|
||||
this.callbacks = {}
|
||||
this.callbacks.base = {}
|
||||
}
|
||||
|
||||
/**
|
||||
* On
|
||||
*/
|
||||
on( names, callback )
|
||||
{
|
||||
let that = this;
|
||||
|
||||
// Errors
|
||||
if( typeof names === 'undefined' || names === '' )
|
||||
{
|
||||
console.warn( 'wrong names' )
|
||||
return false
|
||||
}
|
||||
|
||||
if( typeof callback === 'undefined' )
|
||||
{
|
||||
console.warn( 'wrong callback' )
|
||||
return false
|
||||
}
|
||||
|
||||
// Resolve names
|
||||
names = this.resolve_names( names )
|
||||
|
||||
// Each name
|
||||
names.forEach( function( name )
|
||||
{
|
||||
// Resolve name
|
||||
name = that.resolve_name( name )
|
||||
|
||||
// Create namespace if not exist
|
||||
if( !( that.callbacks[ name.namespace ] instanceof Object ) )
|
||||
that.callbacks[ name.namespace ] = {}
|
||||
|
||||
// Create callback if not exist
|
||||
if( !( that.callbacks[ name.namespace ][ name.value ] instanceof Array ) )
|
||||
that.callbacks[ name.namespace ][ name.value ] = []
|
||||
|
||||
// Add callback
|
||||
that.callbacks[ name.namespace ][ name.value ].push( callback )
|
||||
})
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Off
|
||||
*/
|
||||
off( names )
|
||||
{
|
||||
let that = this
|
||||
|
||||
// Errors
|
||||
if( typeof names === 'undefined' || names === '' )
|
||||
{
|
||||
console.warn( 'wrong name' )
|
||||
return false
|
||||
}
|
||||
|
||||
// Resolve names
|
||||
names = this.resolve_names( names )
|
||||
|
||||
// Each name
|
||||
names.forEach( function( name )
|
||||
{
|
||||
// Resolve name
|
||||
name = that.resolve_name( name )
|
||||
|
||||
// Remove namespace
|
||||
if( name.namespace !== 'base' && name.value === '' )
|
||||
{
|
||||
delete that.callbacks[ name.namespace ]
|
||||
}
|
||||
|
||||
// Remove specific callback in namespace
|
||||
else
|
||||
{
|
||||
// Default
|
||||
if( name.namespace === 'base' )
|
||||
{
|
||||
// Try to remove from each namespace
|
||||
for( let namespace in that.callbacks )
|
||||
{
|
||||
if( that.callbacks[ namespace ] instanceof Object && that.callbacks[ namespace ][ name.value ] instanceof Array )
|
||||
{
|
||||
delete that.callbacks[ namespace ][ name.value ]
|
||||
|
||||
// Remove namespace if empty
|
||||
if( Object.keys(that.callbacks[ namespace ] ).length === 0 )
|
||||
delete that.callbacks[ namespace ]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Specified namespace
|
||||
else if( that.callbacks[ name.namespace ] instanceof Object && that.callbacks[ name.namespace ][ name.value ] instanceof Array )
|
||||
{
|
||||
delete that.callbacks[ name.namespace ][ name.value ]
|
||||
|
||||
// Remove namespace if empty
|
||||
if( Object.keys( that.callbacks[ name.namespace ] ).length === 0 )
|
||||
delete that.callbacks[ name.namespace ]
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Trigger
|
||||
*/
|
||||
trigger( name, args )
|
||||
{
|
||||
// Errors
|
||||
if( typeof name === 'undefined' || name === '' )
|
||||
{
|
||||
console.warn( 'wrong name' )
|
||||
return false
|
||||
}
|
||||
|
||||
let that = this,
|
||||
final_result,
|
||||
result
|
||||
|
||||
// Default args
|
||||
if( !( args instanceof Array ) )
|
||||
args = []
|
||||
|
||||
// Resolve names (should on have one event)
|
||||
name = this.resolve_names( name )
|
||||
|
||||
// Resolve name
|
||||
name = that.resolve_name( name[ 0 ] )
|
||||
|
||||
// Default namespace
|
||||
if( name.namespace === 'base' )
|
||||
{
|
||||
// Try to find callback in each namespace
|
||||
for( let namespace in that.callbacks )
|
||||
{
|
||||
if( that.callbacks[ namespace ] instanceof Object && that.callbacks[ namespace ][ name.value ] instanceof Array )
|
||||
{
|
||||
that.callbacks[ namespace ][ name.value ].forEach( function( callback )
|
||||
{
|
||||
result = callback.apply( that,args )
|
||||
|
||||
if( typeof final_result === 'undefined' )
|
||||
final_result = result
|
||||
} )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Specified namespace
|
||||
else if( this.callbacks[ name.namespace ] instanceof Object )
|
||||
{
|
||||
if( name.value === '' )
|
||||
{
|
||||
console.warn( 'wrong name' )
|
||||
return this
|
||||
}
|
||||
|
||||
that.callbacks[ name.namespace ][ name.value ].forEach( function( callback )
|
||||
{
|
||||
result = callback.apply( that, args )
|
||||
|
||||
if( typeof final_result === 'undefined' )
|
||||
final_result = result
|
||||
})
|
||||
}
|
||||
|
||||
return final_result
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve names
|
||||
*/
|
||||
resolve_names( names )
|
||||
{
|
||||
names = names.replace( /[^a-zA-Z0-9 ,\/.]/g, '' )
|
||||
names = names.replace( /[,\/]+/g, ' ' )
|
||||
names = names.split( ' ' )
|
||||
|
||||
return names
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve name
|
||||
*/
|
||||
resolve_name( name )
|
||||
{
|
||||
let new_name = {},
|
||||
|
||||
parts = name.split( '.' )
|
||||
|
||||
new_name.original = name
|
||||
new_name.value = parts[ 0 ]
|
||||
new_name.namespace = 'base' // Base namespace
|
||||
|
||||
// Specified namespace
|
||||
if( parts.length > 1 && parts[ 1 ] !== '' )
|
||||
new_name.namespace = parts[ 1 ]
|
||||
|
||||
return new_name
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Event_Emitter
|
||||
Reference in New Issue
Block a user