{"version":3,"sources":["../../../packages/core/data/units.ts"],"names":[],"mappings":"AA6BA;;GAEG;AACH,oBAAY,mBAAmB;IAC3B,MAAM,OAAO;IACb,OAAO,OAAO;CACjB;AAED;;;GAGG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAA8B;IAC7D,OAAO,CAAC,MAAM,KAAK,UAAU,GAiB5B;IAED;;;;;OAKG;WACW,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,MAAM;IAiBjF;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAU3B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,OAAO;CAYzB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC7B;;;;OAIG;WACW,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAQjE","file":"units.d.ts","sourcesContent":["import { Strings } from '../generated/strings';\r\n\r\n/**\r\n * The units used in conversion.\r\n */\r\nenum Unit {\r\n    Byte = 0,\r\n\r\n    // SI Prefix\r\n    Kilobyte = 1,\r\n    Megabyte = 2,\r\n    Gigabyte = 3,\r\n    Terabyte = 4,\r\n    Petabyte = 5,\r\n    Exabyte = 6,\r\n    Zettabyte = 7,\r\n    Yottabyte = 8,\r\n\r\n    // IEC Prefix\r\n    Kibibyte = 1,\r\n    Mebibyte = 2,\r\n    Gibibyte = 3,\r\n    Tebibyte = 4,\r\n    Pebibyte = 5,\r\n    Exbiyte = 6,\r\n    Zebibyte = 7,\r\n    Yebibyte = 8\r\n}\r\n\r\n/**\r\n * The base of byte representation to use in conversion.\r\n */\r\nexport enum MediaConversionBase {\r\n    Binary = 1024,\r\n    Decimal = 1000\r\n}\r\n\r\n/**\r\n * Methods for converting media units (i.e. bytes) into display formats.\r\n * @dynamic\r\n */\r\nexport class MediaConversion {\r\n    private static cachedIecUnitMap: { [index: number]: string };\r\n    private static get iecUnitMap(): { [index: number]: string } {\r\n        if (!MediaConversion.cachedIecUnitMap) {\r\n            const strings = MsftSme.getStrings<Strings>().MsftSmeShell.Core;\r\n            MediaConversion.cachedIecUnitMap = {\r\n                0: strings.Units.MediaConversionB.label,\r\n                1: strings.Units.MediaConversionKB.label,\r\n                2: strings.Units.MediaConversionMB.label,\r\n                3: strings.Units.MediaConversionGB.label,\r\n                4: strings.Units.MediaConversionTB.label,\r\n                5: strings.Units.MediaConversionPT.label,\r\n                6: strings.Units.MediaConversionXB.label,\r\n                7: strings.Units.MediaConversionZB.label,\r\n                8: strings.Units.MediaConversionYB.label\r\n            };\r\n        }\r\n\r\n        return MediaConversion.cachedIecUnitMap;\r\n    }\r\n\r\n    /**\r\n     * Converts the supplied bytes into the appropriate display string.\r\n     *\r\n     * @param bytes The raw number of bytes.\r\n     * @param base The byte representation base to use in conversion.\r\n     */\r\n    public static getConvertedValue(bytes: number, base: MediaConversionBase): string {\r\n        if (bytes != null && !isNaN(bytes)) {\r\n            const unit = MediaConversion.getUnit(bytes, base);\r\n            const result = MediaConversion.convertValue(bytes, base, unit, false);\r\n            const displayUnit = MediaConversion.iecUnitMap[unit];\r\n            if (displayUnit) {\r\n                return MsftSme.getStrings<Strings>()\r\n                    .MsftSmeShell.Core.Units.MediaConversionFormat.message.format(result, displayUnit);\r\n            }\r\n\r\n            return MsftSme.getStrings<Strings>().MsftSmeShell.Core.Units.MediaConversionFormat.message.format(\r\n                bytes, MediaConversion.iecUnitMap[0]);\r\n        }\r\n\r\n        return MsftSme.getStrings<Strings>().MsftSmeShell.Core.Units.MediaConversionUnknownFormat.message;\r\n    }\r\n\r\n    /**\r\n     * Converts the raw bytes into the number corresponding to it's appropriate display value.\r\n     *\r\n     * @param bytes The raw number of bytes.\r\n     * @param base the byte representation base to use in conversion.\r\n     * @param unit The desired unit of conversion.\r\n     * @param floor Whether or not to floor the result.\r\n     */\r\n    private static convertValue(bytes: number, base: MediaConversionBase, unit: Unit, floor?: boolean): number {\r\n        const fixedDecimalPlaces = 2;\r\n        const result = bytes / Math.pow(base, unit);\r\n        if (floor) {\r\n            return Math.floor(result);\r\n        }\r\n\r\n        return parseFloat(result.toFixed(fixedDecimalPlaces));\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate unit for a number of raw bytes in a particular base.\r\n     *\r\n     * @param bytes The raw number of bytes.\r\n     * @param base The byte representation base to use in conversion.\r\n     */\r\n    private static getUnit(bytes: number, base: MediaConversionBase): Unit {\r\n        if (bytes === 0) {\r\n            return <Unit>bytes;\r\n        }\r\n\r\n        let iterator = 0;\r\n        while ((bytes / Math.pow(base, iterator)) >= base) {\r\n            iterator++;\r\n        }\r\n\r\n        return <Unit>iterator;\r\n    }\r\n}\r\n\r\n/**\r\n * Methods for converting percentages into display formats.\r\n */\r\nexport class PercentageConversion {\r\n    /**\r\n     * Converts the given value to a percentage.\r\n     *\r\n     * @param value the value to display as percent srring.\r\n     */\r\n    public static getPercentageDisplayValue(value: number): string {\r\n        if (value != null && !isNaN(value)) {\r\n            return MsftSme.getStrings<Strings>()\r\n                .MsftSmeShell.Core.Units.PercentageConversionPercentFormat.message.format(value.toString());\r\n        } else {\r\n            return MsftSme.getStrings<Strings>().MsftSmeShell.Core.Units.PercentageConversionUnknownFormat.message;\r\n        }\r\n    }\r\n}\r\n"]}