import { Type, apply } from "free-types-core"; import { $Iterator } from "./Iterators"; import { NOT_FOUND, BaseType, self } from "../types"; import { GetOrElse, IsAny } from "../utils"; export type $SearchMode = { total: $TotalSearch; shallow: $ShallowSearch; deep: $DeepSearch; }; export type $DeepSearch = Type<[ Limit: number, Acc: unknown[][], Value: unknown, Path: unknown[], Search: $SearchMode ], unknown[][]>; export type $TotalSearch = Type<[ Acc: unknown[][], $I: $Iterator, S: ShallowSearchResult ]>; export type $ShallowSearch = Type<[ Limit: number, $I: $Iterator ], ShallowSearchResult>; export type ShallowSearchResult = { partial: unknown[][]; total: unknown[][]; limit: number; }; export type ShouldStop = Limit extends 0 | never ? true : apply<$I['done'], [I]>; export type NonEmpty = GetOrElse; export type IsNeedle = IsAny extends true ? IsAny extends true ? true : false : IsAny extends true ? false : [T] extends [never] ? [Needle] extends [never] ? true : MatchAll extends true ? true : false : [Needle] extends [never] ? [T] extends [never] ? true : false : unknown extends Needle ? unknown extends T ? true : false : T extends Needle ? true : MatchAll extends true ? T extends BaseType ? true : boolean : false; export type MatchAll = Needle extends self ? true : false;