// <reference types="../../typings/number" />
// <reference types="../../typings/record" />
// <reference types="../../typings/string" />

import { isNull, Nil } from './maybe';

export const DICTIONARY = "dictionary";
export const RECORD = "record";

export type RecordType = typeof RECORD;

export type Known =
  | KnownRecord
  | [Known, ...Known[]]
  | Known[]
  | bigint
  | Date
  | number
  | string
  | boolean
  | null;

export interface KnownRecord extends Record<string, Known> {}

export const isEmpty = (val: unknown): val is Nil =>
  val == null || (isObject(val) && Object.keys(val).length === 0);

export const isObject = (val: unknown): val is Record<string, any> => val === Object(val);

export const isPrimitive = (val: unknown): boolean => Object(val) !== val;

export const isPlainObject = (val: unknown): val is KnownRecord =>
  !isNull(val) && isObject(val) && val.constructor === Object;
