@reis/seki
Version:
Seki – A modern javascript based Go board renderer and player, that is simple to use, extensible, compact and intuitive.
87 lines (74 loc) • 1.67 kB
JavaScript
import {deepmerge} from './deepmerge.js'
/**
* Merge implementation
*/
export function merge(...args) {
return deepmerge(...args)
}
/**
* Copy a given value
*/
export function copy(value) {
if (value !== null && typeof value === 'object') {
return JSON.parse(JSON.stringify(value))
}
return value
}
/**
* Flip object keys to values and vice versa
*/
export function flip(obj) {
return Object
.fromEntries(Object
.entries(obj)
.map(([key, value]) => [value, key])
)
}
/**
* Get path in an object
*/
export function get(obj, path, defaultValue = undefined) {
//Invalid path given
if (typeof path !== 'string') {
throw new Error(`Invalid path given for lookup: ${path}`)
}
//Split path in object keys to traverse
const keys = path.split('.')
for (let i = 0; i < keys.length && obj !== undefined; i++) {
const key = keys[i]
obj = (obj !== null) ? obj[key] : undefined
}
//Return default value if undefined
if (obj === undefined) {
return defaultValue
}
//Return reference
return obj
}
/**
* Set a value in an object by path
*/
export function set(obj, path, value) {
//Invalid path
if (typeof path !== 'string') {
throw new Error(`Invalid path given for set: ${path}`)
}
//Split path in object keys to traverse
const keys = path.split('.')
for (let i = 0; i < keys.length; i++) {
if ((i + 1) === keys.length) {
obj[keys[i]] = value
break
}
if (typeof obj[keys[i]] === 'undefined') {
obj[keys[i]] = {}
}
obj = obj[keys[i]]
}
}
/**
* Object check
*/
export function isObject(obj) {
return !!obj && typeof obj === 'object'
}