///
import util = require('./util')
import types = require('./types')
// immutable
export class Opt {
private _v: T = undefined
length = 0
constructor()
constructor( v?: T ) {
this._v = v
if ( typeof v !== 'undefined' ) this.length = 1
}
defined( ): boolean { return this._v !== undefined }
empty(): boolean { return ! this.defined() }
get( strict: boolean = false ): T {
if ( strict && this.empty() ) throw new Error('value not found')
return ( this.empty() ) ? undefined : this._v
}
getOrElse( generator: { (): any } ): any {
return this.defined() ? this._v : generator() ;
}
map( f:( v:T ) => X ): Opt { return this.defined() ? new Opt( f(this._v) ) : Opt.none }
forEach( f:( v:T ) => void ){ if ( this.defined() ) f( this._v ) }
equals( other:any, eq: types.Comparator = util.EQ ): boolean {
return ( other instanceof Opt ) && ( eq( this.get(), other.get() ) )
}
static none = new Opt( )
}