import { EJSONOptions } from "./extended_json.ts";
export interface DoubleExtended { $numberDouble: string;}
export class Double { _bsontype = "Double"; value!: number;
constructor(value: number) { if ((value as unknown) instanceof Number) { value = value.valueOf(); }
this.value = +value; }
valueOf(): number { return this.value; }
toJSON(): number { return this.value; }
toString(radix?: number): string { return this.value.toString(radix); }
toExtendedJSON(options?: EJSONOptions): number | DoubleExtended { if ( options && (options.relaxed && isFinite(this.value)) ) { return this.value; }
if (Object.is(Math.sign(this.value), -0)) { return { $numberDouble: `-${this.value.toFixed(1)}` }; }
let $numberDouble: string; if (Number.isInteger(this.value)) { $numberDouble = this.value.toFixed(1); if ($numberDouble.length >= 13) { $numberDouble = this.value.toExponential(13).toUpperCase(); } } else { $numberDouble = this.value.toString(); }
return { $numberDouble }; }
static fromExtendedJSON( doc: DoubleExtended, options?: EJSONOptions, ): number | Double { const doubleValue = parseFloat(doc.$numberDouble); return options && options.relaxed ? doubleValue : new Double(doubleValue); }
[Symbol.for("Deno.customInspect")](): string { return `new Double(${this.toJSON()})`; }}