import isArray from '../../array/check/isArray'
import isFunction from '../../function/check/isFunction'
import isObjNotNull from './isObjNotNull'
/**
* @name isObjPure
* @memberOf is
*
* @alias isObjNotArrayOrFunction
* @alias isObjectNotArrayOrFunction
* @alias isObjectPure
* @alias isPureObject
*
* @since 3.0.0
*
* @param x value to check
* @return is obj & !null & !undefined & !array & !function
*
* @extends isArray
* @extends isObjNotNull
* @extends isNullOrUndefined
* @extends isFunction
*
* @example
*
* isObjPure(function() {})
* //=> false
* isObjPure(null)
* //=> false
* isObjPure([])
* //=> false
*
* isObjPure({})
* //=> true
*
*/
export type Obj<ValueType = any> = {
[key: string]: ValueType
[key: number]: ValueType
}
export interface IsObjPure<ValueType> extends Function {
(x: Object): x is Obj<ValueType>
(x: Array<any>): false
(x: Function): false
(x: any): boolean
}
// const isObjPure: IsObjPure = (x: any): boolean =>
// isObjNotNull(x) && !isArray(x) && !isFunction(x)
type ReturnTypeIs<Arg> = Arg extends Array<any>
? false
: Arg extends Function
? false
: Arg extends {} | Map<any, any> | Set<any>
? true
: boolean
/**
* @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html
*/
const isObjPure = <Type>(x: unknown): ReturnTypeIs<typeof x> => {
if (isArray(x)) return false
else if (isFunction(x)) return false
else return isObjNotNull(x)
}
// const obj = {}
// const array = []
// const isArr: ReturnTypeIs<Array<any>> = isObjPure(array)
// const isObj: ReturnTypeIs<{}> = isObjPure(obj)
export { isObjPure }
export default isObjPure