Ленивая оценка / поток / код FRP для node.js fs.readdir Асинхронный рекурсивный поиск по каталогам

Я пытаюсь реализовать структуру списка, читающую дерево каталогов FileSystem, используя node.js

DIR / файловая структура:

DIR1
     DIR2R
     file1
     file2
     file3
     …

-> структура списка:

("DIR1" ("DIR2" "file1" "file2" "file3" …))

 DIR()   //looks like a C function
 file    //looks like an Atom value

так, например, данный корневой DIR UNIX:

root bin  cd
          ls

     lib  file1
          file2

     opt

     usr  file3

     file4

эквивалентен списку:

("root" ("bin" ("cd" "ls")
         "lib" ("file1" "file2") 
         "opt" ()
         "usr" ("file3")
         "file4"
        )
)

Сказав это, я хочу реализовать этот код с помощью некоторой ленивой асинхронной последовательности (поток / бесконечный список?).

рекурсивный поиск в каталоге node.js fs.readdir - это хорошая ссылка.

node.js имеет множество отличных библиотек, таких как file.walk и т. д. , но это очень интересная тема, на самом деле существует множество примеров кода.

Другими словами, хороший предмет для изучения базовой концепции ленивой асинхронной последовательности (поток / бесконечный список?), А код может быть хорошей библиотекой, которую я хочу реализовать с нуля.



substack / stream-handbook охватывает основы написания программ на node.js с потоки. Действительно отличная статья.


Итак, вот моя мысль по этому поводу - Рекурсивная обработка дерева Dir:

  • Эта тема связана с рекурсивным поиском, и существует 2 способа: асинхронный и синхронный, по разным причинам я выбрал метод асинхронный.

  • Результат поиска эквивалентен структуре списка, где имеет значение парадигма функционального программирования (Lisp / Scheme).

  • Для функционального программирования JavaScript существуют такие библиотеки, как underscore.js, а недавно и < strong> lazy.js с одним важным отличием: ленивое вычисление (также известное как отложенное выполнение), где превосходит underscore.js.

  • lazy.js также включает потоковую обработку в Node.js. Я также обнаружил, что stream.js говорит: бесконечное количество элементов. Их сила заключается в том, что их лениво оценивают, что, говоря простым языком, означает, что они могут содержать бесконечное количество элементов..

  • Потоковые данные (бесконечный список) реализуют парадигму Реактивного функционального программирования (FRP). lazy.js фактически демонстрирует реализацию FRP события мыши. RxJS - это библиотека FRP: RxJS или реактивные расширения для JavaScript - это библиотека для преобразования, составления и запроса потоков данных.

  • async этого предмета является предметом FRP.

  • Следовательно, ленивая оценка является основным фактором более быстрой обработки списка функционального программирования и расширяет список до бесконечного списка (потока), который интегрирует асинхронные / события в источник данных потока для обработки в парадигме функционального программирования (FunctionalReactiveProgramming).

  • node-lazy Введение четко заявляет: Lazy приходит на самом деле удобно, когда вам нужно обработать поток событий как список. Наилучшим вариантом использования в настоящее время является возврат ленивого списка из асинхронной функции и передача данных в него через события. В асинхронном программировании вы не можете просто вернуть обычный список, потому что у вас еще нет данных для него. Обычным решением до сих пор было предоставление обратного вызова, который вызывается, когда данные доступны. Но, делая это таким образом, вы теряете возможность связывать функции и создавать каналы, что приводит к не очень приятным интерфейсам. (См. Второй пример ниже, чтобы увидеть, как он улучшил интерфейс в одном из моих модулей.)


Наконец, вот мой вопрос по этой теме - Рекурсивная обработка дерева Dir:

Есть ли какой-либо образец кода для реализации этой темы исключительно в режиме отложенной оценки или в стиле FRP?

Я знаю, что lazy.js, stream.js или linq.js основаны на ленивой оценке, но ни один из них не может определить node.js fs.readdir как данные потока для асинхронной обработки (FRP) . Согласно http://danieltao.com/lazy.js/docs/AsyncSequence.html, это еще не реализовано, правильно?

RxJS, вероятно, сможет, но я не знаю как.

Google rx.Observable fs.readdir ничего не обнаруживает.

Любые идеи?


person Community    schedule 12.07.2013    source источник


Ответы (1)


Вот начало на основе https://gist.github.com/edygar/ee0945a73c79182367df

Учитывая каталог, он создает список подкаталогов.

(кофе)

Rx = require "rx"
fs = require "fs"

readdir = Rx.Observable.fromNodeCallback fs.readdir
stat = Rx.Observable.fromNodeCallback (pathName, cb) ->
    fs.stat pathName, (err, stats) ->
        stats.pathName = pathName
        cb err, stats

dirObservable = (dirPath) ->
    readdir dirPath
        .flatMap (items) -> Rx.Observable.from items
        .flatMap (item) -> stat item
        .filter (stats) -> stats.isDirectory()
        .map (stats) -> stats.pathName

module.exports = dirObservable


if not module.parent
    path = require "path"
    dirobs = dirObservable path.resolve __dirname, ".."
    dirobs.subscribe (data) -> console.log data
person irickt    schedule 08.01.2015