/**
 * The type representing the value of a property.
 */ export type Value = null | boolean | number | string | object ; example export interface ValueMap { [ name ] : Value ; } remarks Concrete implementation of `Env` like  MapEnv are used
 * to resolve the property names used in  Expr .
 *
 *  example export class Env { /**
     * Returns `true` if the given object is an instance of  Env .
     *
     *  param object static isEnv ( object ) { return object instanceof Env ; } /**
     * Returns property in  Env by name.
     *
     *  param name lookup ( name ) { return undefined ; } /**
     * Return an object containing all properties of this environment. (Here: empty object).
     */ unmap ( ) { return { } ; } } /**
 * `MapEnv` is a concrete implementation of  Env that
 * creates a lookup environment from a set of properties.
 *
 *  example export class MapEnv extends Env { constructor ( readonly entries , private readonly parent ? ) { super ( ) ; } /**
     * Returns property in  Env by name.
     *
     *  param name @override
      lookup ( name ) { if ( this . entries . hasOwnProperty ( name ) ) { const value = this . entries [ name ] ; if ( value !== undefined ) { return value ; } } return this . parent ? this . parent . lookup ( name ) : undefined ; } @override
      unmap ( ) { const obj = this . parent ? this . parent . unmap ( ) : { } ; for ( const key in this . entries ) { if ( this . entries . hasOwnProperty ( key ) ) { obj [ key ] = this . entries [ key ] ; } } return obj ; } }