import {
IteratableValue,
IterateeFunction,
Property,
} from './typings.loop.each'
export interface BaseForIteratee<Obj, KeyReturn> extends Function {
(x: Obj[keyof Obj], key: KeyReturn, obj: Obj): boolean | void
}
/**
* The base implementation of `baseForOwn` which iterates over `object`
* properties returned by `keysFunc` and invokes `iteratee` for each property.
* Iteratee functions may exit iteration early by explicitly returning `false`.
* @since 5.0.0-beta.6
* @memberOf loop
*
* @param object The object to iterate over.
* @param iteratee The function invoked per iteration.
* @param keysFunc The function to get the keys of `object`.
* @return Returns `object`.
*
*/
function baseFor<Obj extends {} | any, KeyReturn = any>(
object: Obj,
iteratee: BaseForIteratee<Obj, KeyReturn>,
keysFunc: (x: Obj) => KeyReturn[]
) {
const iterable = Object(object)
const props = keysFunc(object)
let { length } = props
let index = -1
while (length--) {
const key = props[++index]
if (iteratee(iterable[key], key, iterable) === false) {
break
}
}
return object
}
export default baseFor