Монадические приседания в JS/TS

Apr 13, 2021 09:48

Set поддерживает конструирования из Iterable. Есть AsyncIterable. Но Set из него сконструировать нельзя. Почему? А вот по "алгебраическим" причинам.

Ну вот у нас есть Set.fromList :: Ord a => [a] -> Set a

Как из него сделать Monad m => Ord a => m [a] -> m (Set a)? Просто, через fmap fromList. Но это же не то, что нужно!

Т.е. можно написать ((x: AsyncIterable) => Promise), но это же не то, что нужно. А того, что нужно, написать, задейстовав имеющийся вариант new Set(), низя.

Как поменять JS/TS, чтобы можно было? Тоже непонятно. Конструкторы синхронные. Если делать руками - получается максимум static factory method:
async function setFromAsyncIterable (asyncIterable: AsyncIterable): Promise> {
const set = new Set()
for await (const setElement of asyncIterable) {
set.add(setElement)
}
return set
}Но на самом деле этот метод выглядит красиво, а по перфомансу - полная хуйня. Как и изначально AsyncIterable. Нужон двухуровневый AsyncIterable
>. Скажем, вы конструируете Set рекурсивным обходом каталогов. И вам логично конструировать N элементов параллельно в произвольном порядке, загружая дисковую очередь.

И тут понятно что могут быть разные случаи, аналогичные ситуации с spine strict lists, т.е 4 комбинации от Iterable без промиса до AsyncIterable с промисом.

fp, все пидарасы а я, выебудни, programming

Previous post Next post
Up