Функция Clojure split-with
довольно удобна, но она должна дважды пересечь переднюю часть seq, поскольку она буквально реализована как [(take-while pred coll) (drop-while pred coll)]
. Тем не менее, довольно легко написать (хвостовую рекурсивную) версию, которая пересекает ведущую часть только один раз (поместите ведущую часть в накапливающийся вектор и т. Д.).
Однако я хотел бы извлечь первый элемент из списка , который удовлетворяет предикату, и вернуть как элемент, так и оставшийся список (т. Е. (concat (take-while pred coll) (next (drop-while pred coll)))
) - надеюсь, за один проход , Если бы я использовал какой-то императивный язык, я бы просто прошел по списку, держась за последнюю ячейку, и, как только я получил элемент, чтобы выскочить, возиться со «следующим указателем» предыдущей ячейки, чтобы восстановить измененный список, но на функциональном языке это кажется невозможным.
Так есть ли способ сделать это эффективно в Clojure?