# types.js A library of JavaScript type extensions, types and type utilities. - [types.js](#typesjs) - [Installation](#installation) - [Basic usage](#basic-usage) - [Built-in type extensions](#built-in-type-extensions) - [`Object`](#object) - [`Object.deepKeys(..)`](#objectdeepkeys) - [`Object.match(..)`](#objectmatch) - [`Object.matchPartial(..)`](#objectmatchpartial) - [`Object.flatCopy(..)`](#objectflatcopy) - [`.run(..)`](#objectrun) - [`Array`](#array) - [`.first(..)` / `.last(..)`](#arrayfirst--arraylast) - [`.compact()`](#arraycompact) - [`.len`](#arraylen) - [`.toKeys(..)`](#arraytokeys) - [`.toMap(..)`](#arraytomap) - [`.unique(..)` / `.tailUnique(..)`](#arrayunique--arraytailunique) - [`.cmp(..)`](#arraycmp) - [`.setCmp(..)`](#arraysetcmp) - [`.sortAs(..)`](#arraysortas) - [`.inplaceSortAs(..)`](#arrayinplacesortas) - [`.mapChunks(..)`](#arraymapchunks) - [`.filterChunks(..)`](#arrayfilterchunks) - [`.reduceChunks(..)`](#arrayreducechunks) - [`Array` (polyfill)](#array-polyfill) - [`.flat()`](#arrayflat) - [`.includes()`](#arrayincludes) - [`Set`](#set) - [`.unite(..)`](#setunite) - [`.intersect(..)`](#setintersect) - [`.subtract(..)`](#setsubtract) - [`Date`](#date) - [`Date.timeStamp(..)`](#datetimestamp) - [`Date.fromTimeStamp(..)`](#datefromtimestamp) - [`Date.str2ms(..)`](#datestr2ms) - [`.toShortDate(..)`](#datetoshortdate) - [`.getTimeStamp(..)`](#dategettimestamp) - [`.setTimeStamp(..)`](#datesettimestamp) - [`String`](#string) - [`.capitalize()`](#stringcapitalize) - [`RegExp`](#regexp) - [`RegExp.quoteRegExp(..)`](#regexpquoteregexp) - [Containers](#containers) - [`containers.UniqueKeyMap()` (`Map`)](#containersuniquekeymap-map) - [`.set(..)`](#unique-key-mapset) - [`.reset(..)`](#unique-key-mapreset) - [`.rename(..)`](#unique-key-maprename) - [`.unorderedRename(..)`](#unique-key-mapunorderedrename) - [`.keysOf(..)`](#unique-key-mapkeysof) - [`.originalKey(..)`](#unique-key-maporiginalkey) - [`.uniqueKey(..)`](#unique-key-mapuniquekey) - [`.__key_pattern__`](#unique-key-map__key_pattern__) - [License](#license) ## Installation ```shell $ npm install -s 'ig-types' ``` ## Basic usage To extend everything: ```javascript require('ig-types') ``` To have access to library types and utilities: ```javascript var types = require('ig-types') ``` `types.js` is organized so as to be able to import/extend only specific sub-modules mostly independently so... In case there is a need to only extend a specific constructor: ```javascript // require `ig-types/`... require('ig-types/Array') ``` And to import specific library modules only: ```javascript var containers = require('ig-types/containers') ``` Note that though mostly independent now some sub-modules may import others in the future. ## Built-in type extensions ### `Object` #### `Object.deepKeys(..)` #### `Object.match(..)` #### `Object.matchPartial(..)` #### `Object.flatCopy(..)` #### `.run(..)` ``` .run() -> -> ``` Run a function in the context of `` returning either `` itself (if returning `undefined`) or the result. Note that this is accessible from all JavaScript non-primitive objects, i.e. everything that inherits from `Object`. Example: ```javascript var L = [1, 2, 3] .map(function(e){ return e * 2 }) // see if the first element is 1 and prepend 1 if it is not... .run(function(){ if(this[0] != 1){ this.unshift(1) } }) console.log(L) // -> [1, 2, 6, 8] ``` `.run(..)` is also available standalone via: ```shell $ npm install -s object-run ``` For more info see: https://github.com/flynx/object-run.js ### `Array` #### `.first(..)` / `.last(..)` Get or set the first/last items of ``. #### `.compact()` Generate a compact `` from a sparse ``, i.e. removing all the empty slots. #### `.len` Number of non-empty slots/elements in ``. #### `.toKeys(..)` #### `.toMap(..)` #### `.unique(..)` / `.tailUnique(..)` Generate an array with all duplicate elements removed. #### `.cmp(..)` #### `.setCmp(..)` #### `.sortAs(..)` #### `.inplaceSortAs(..)` #### `.mapChunks(..)` #### `.filterChunks(..)` #### `.reduceChunks(..)` ### `Array` (polyfill) #### `.flat()` #### `.includes()` ### `Set` #### `.unite(..)` #### `.intersect(..)` #### `.subtract(..)` ### `Date` #### `Date.timeStamp(..)` #### `Date.fromTimeStamp(..)` #### `Date.str2ms(..)` #### `.toShortDate(..)` #### `.getTimeStamp(..)` #### `.setTimeStamp(..)` ### `String` #### `.capitalize()` ### `RegExp` #### `RegExp.quoteRegExp(..)` ## Containers ```javascript var containers = require('ig-types').containers ``` or, to only import containers: ```javascript var containers = require('ig-types/containers') ``` ### `containers.UniqueKeyMap()` (`Map`) `UniqueKeyMap` implements a key-value container (i.e. `Map`) that supports and maintains _duplicate_ keys by appending an index to them. The original keys are stored internally thus the renaming mechanics are stable. `UniqueKeyMap` extends the `Map` constructor, so all the usual `Map` methods and properties apply here. To construct an instance: ```javascript var x = new UniqueKeyMap() ``` or: ```javascript // new is optional... var y = UniqueKeyMap() ``` `UniqueKeyMap` supports the same initialization signature as `Map` but treats repeating keys differently. ```javascript var z = UniqueKeyMap([['a', 1], ['a', 2], ['b', 1]]) ``` The second `"a"` item will automatically get re-keyed as `"a (1)"`: ```javascript console.log([...z.keys()]) // -> ['a', 'a (1)', 'b'] ``` Note that `.set(..)` will never rewrite an element: ```javascript z.set('a', 3) console.log([...z.keys()]) // -> ['a', 'a (1)', 'b', 'a (2)'] z.get('a') // -> 1 z.get('a (1)') // -> 2 ``` To get the generated key: ```javascript var k = z.set('a', 4, true) console.log(k) // -> 'a (3)' ``` To explicitly rewrite an item: ```javascript z.reset('a (1)', 4) z.get('a (1)') // -> 4 ``` And we can _rename_ items, i.e. change their key: ```javascript z.rename('a (2)', 'c') console.log([...z.keys()]) // -> ['a', 'a (1)', 'b', 'a (3)', 'c'] ``` For more info on `Map` see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map #### `.set(..)` ``` .reset(, ) -> .reset(, , true) -> ``` Add an `` to ``. If `` already exists then add an index to it to make it unique. Key updating is done via [`.__key_pattern__`](#unique-key-map__key_pattern__). #### `.reset(..)` ``` .reset(, ) -> ``` Explicitly write an `` under `` as-is, this is like `Map`'s `.set(..)`. #### `.rename(..)` #### `.unorderedRename(..)` #### `.keysOf(..)` #### `.originalKey(..)` #### `.uniqueKey(..)` #### `.__key_pattern__` ## License [BSD 3-Clause License](./LICENSE) Copyright (c) 2020, Alex A. Naanou, All rights reserved.