'use strict'; 
 | 
  
 | 
const Util = require('util'); 
 | 
  
 | 
const Hoek = require('@hapi/hoek'); 
 | 
  
 | 
const Any = require('../any'); 
 | 
  
 | 
  
 | 
const internals = {}; 
 | 
  
 | 
  
 | 
internals.Map = class extends Map { 
 | 
  
 | 
    slice() { 
 | 
  
 | 
        return new internals.Map(this); 
 | 
    } 
 | 
  
 | 
    toString() { 
 | 
  
 | 
        return Util.inspect(this); 
 | 
    } 
 | 
}; 
 | 
  
 | 
  
 | 
internals.Symbol = class extends Any { 
 | 
  
 | 
    constructor() { 
 | 
  
 | 
        super(); 
 | 
        this._type = 'symbol'; 
 | 
        this._inner.map = new internals.Map(); 
 | 
    } 
 | 
  
 | 
    _base(value, state, options) { 
 | 
  
 | 
        if (options.convert) { 
 | 
            const lookup = this._inner.map.get(value); 
 | 
            if (lookup) { 
 | 
                value = lookup; 
 | 
            } 
 | 
  
 | 
            if (this._flags.allowOnly) { 
 | 
                return { 
 | 
                    value, 
 | 
                    errors: (typeof value === 'symbol') ? null : this.createError('symbol.map', { value, map: this._inner.map }, state, options) 
 | 
                }; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        return { 
 | 
            value, 
 | 
            errors: (typeof value === 'symbol') ? null : this.createError('symbol.base', { value }, state, options) 
 | 
        }; 
 | 
    } 
 | 
  
 | 
    map(iterable) { 
 | 
  
 | 
        if (iterable && !iterable[Symbol.iterator] && typeof iterable === 'object') { 
 | 
            iterable = Object.entries(iterable); 
 | 
        } 
 | 
  
 | 
        Hoek.assert(iterable && iterable[Symbol.iterator], 'Iterable must be an iterable or object'); 
 | 
        const obj = this.clone(); 
 | 
  
 | 
        const symbols = []; 
 | 
        for (const entry of iterable) { 
 | 
            Hoek.assert(entry && entry[Symbol.iterator], 'Entry must be an iterable'); 
 | 
            const [key, value] = entry; 
 | 
  
 | 
            Hoek.assert(typeof key !== 'object' && typeof key !== 'function' && typeof key !== 'symbol', 'Key must not be an object, function, or Symbol'); 
 | 
            Hoek.assert(typeof value === 'symbol', 'Value must be a Symbol'); 
 | 
            obj._inner.map.set(key, value); 
 | 
            symbols.push(value); 
 | 
        } 
 | 
  
 | 
        return obj.valid(...symbols); 
 | 
    } 
 | 
  
 | 
    describe() { 
 | 
  
 | 
        const description = super.describe(); 
 | 
        description.map = new Map(this._inner.map); 
 | 
        return description; 
 | 
    } 
 | 
}; 
 | 
  
 | 
  
 | 
module.exports = new internals.Symbol(); 
 |