1#' Do every, some, or none of the elements of a list satisfy a predicate?
2#'
3#' @inheritParams map
4#' @param .p A predicate function to apply on each element of `.x`.
5#'   `some()` returns `TRUE` when `.p` is `TRUE` for at least one
6#'   element. `every()` returns `TRUE` when `.p` is `TRUE` for all
7#'   elements. `none()` returns `TRUE` when `.p` is `FALSE` for all
8#'   elements.`
9#' @param ... Additional arguments passed on to `.p`.
10#' @return A logical vector of length 1.
11#' @export
12#' @examples
13#' y <- list(0:10, 5.5)
14#' y %>% every(is.numeric)
15#' y %>% every(is.integer)
16#' y %>% some(is.integer)
17#' y %>% none(is.character)
18every <- function(.x, .p, ...) {
19  .p <- as_predicate(.p, ..., .mapper = TRUE, .deprecate = TRUE)
20
21  for (i in seq_along(.x)) {
22    val <- .p(.x[[i]], ...)
23    if (is_false(val)) return(FALSE)
24    if (anyNA(val)) return(NA)
25  }
26
27  TRUE
28}
29
30#' @export
31#' @rdname every
32some <- function(.x, .p, ...) {
33  .p <- as_predicate(.p, ..., .mapper = TRUE, .deprecate = TRUE)
34
35  val <- FALSE
36  for (i in seq_along(.x)) {
37    val <- val || .p(.x[[i]], ...)
38    if (is_true(val)) return(TRUE)
39  }
40
41  val
42}
43
44#' @export
45#' @rdname every
46none <- function(.x, .p, ...) {
47  every(.x, negate(.p), ...)
48}
49