testthat::test_that("fapply dispatches for flexseq", {
  x <- as_flexseq(1:4)
  y <- fapply(x, function(v) v * 3)

  testthat::expect_s3_class(y, "flexseq")
  testthat::expect_identical(lapply(.ft_to_list(y), .ft_strip_name), as.list(c(3, 6, 9, 12)))
  testthat::expect_error(fapply(x, 1), "`FUN` must be a function")
})

testthat::test_that("fapply dispatches for priority_queue", {
  q <- priority_queue("a", "bb", "ccc", priorities = c(1, 3, 2))
  q2 <- fapply(q, function(value, priority, name) {
    toupper(value)
  })
  q3 <- fapply(q, function(value, priority) {
    paste0(value, ":", priority)
  })

  testthat::expect_s3_class(q2, "priority_queue")
  testthat::expect_equal(peek_min(q2), "A")
  testthat::expect_equal(peek_max(q2), "BB")
  testthat::expect_equal(peek_min(q3), "a:1")
  testthat::expect_equal(peek_max(q3), "bb:3")
  testthat::expect_error(fapply(q, 1), "`FUN` must be a function")
})

testthat::test_that("fapply dispatches for ordered_sequence", {
  xs <- as_ordered_sequence(setNames(list("x1", "x2", "x3"), c("a", "b", "c")), keys = c(1, 1, 2))

  xs_item <- fapply(xs, function(value, key, name) {
    toupper(value)
  })
  testthat::expect_s3_class(xs_item, "ordered_sequence")
  testthat::expect_equal(unname(as.list(xs_item)), list("X1", "X2", "X3"))
  testthat::expect_identical(names(as.list(xs_item)), c("a", "b", "c"))

  xs_tagged <- fapply(xs, function(value, key, name) {
    paste(value, key, name, sep = "|")
  })
  xs2 <- fapply(xs, function(value, key) {
    paste(value, key, sep = "|")
  })
  testthat::expect_equal(unname(as.list(xs_tagged)), list("x1|1|a", "x2|1|b", "x3|2|c"))
  testthat::expect_identical(names(as.list(xs_tagged)), c("a", "b", "c"))
  testthat::expect_equal(count_key(xs_tagged, 1), 2L)
  testthat::expect_equal(count_key(xs_tagged, 2), 1L)
  testthat::expect_equal(unname(as.list(xs2)), list("x1|1", "x2|1", "x3|2"))

  testthat::expect_error(fapply(xs, 1), "`FUN` must be a function")
})
