export function get ( key ) { return key ? this._state[ key ] : this._state; } export function fire ( eventName, data ) { var handlers = eventName in this._handlers && this._handlers[ eventName ].slice(); if ( !handlers ) return; for ( var i = 0; i < handlers.length; i += 1 ) { handlers[i].call( this, data ); } } export function observe ( key, callback, options ) { var group = ( options && options.defer ) ? this._observers.post : this._observers.pre; ( group[ key ] || ( group[ key ] = [] ) ).push( callback ); if ( !options || options.init !== false ) { callback.__calling = true; callback.call( this, this._state[ key ] ); callback.__calling = false; } return { cancel: function () { var index = group[ key ].indexOf( callback ); if ( ~index ) group[ key ].splice( index, 1 ); } }; } export function observeDev ( key, callback, options ) { var c = ( key = '' + key ).search( /[^\w]/ ); if ( c > -1 ) { var message = "The first argument to component.observe(...) must be the name of a top-level property"; if ( c > 0 ) message += ", i.e. '" + key.slice( 0, c ) + "' rather than '" + key + "'"; throw new Error( message ); } return observe.call( this, key, callback, options ); } export function on ( eventName, handler ) { if ( eventName === 'teardown' ) return this.on( 'destroy', handler ); var handlers = this._handlers[ eventName ] || ( this._handlers[ eventName ] = [] ); handlers.push( handler ); return { cancel: function () { var index = handlers.indexOf( handler ); if ( ~index ) handlers.splice( index, 1 ); } }; } export function onDev ( eventName, handler ) { if ( eventName === 'teardown' ) { console.warn( "Use component.on('destroy', ...) instead of component.on('teardown', ...) which has been deprecated and will be unsupported in Svelte 2" ); return this.on( 'destroy', handler ); } return on.call( this, eventName, handler ); } export function set ( newState ) { this._set( newState ); ( this._root || this )._flush(); } export function _flush () { if ( !this._renderHooks ) return; while ( this._renderHooks.length ) { var hook = this._renderHooks.pop(); hook.fn.call( hook.context ); } } export var proto = { get: get, fire: fire, observe: observe, on: on, set: set, _flush: _flush }; export var protoDev = { get: get, fire: fire, observe: observeDev, on: onDev, set: set, _flush: _flush };