Sto tentando di scrivere un Conduit
utilizzando un parser attoparsec. Specificatamente, dato parseOne :: Parser T
, vorrei creare un Conduit ByteString m T
che applica ripetutamente il parser all'input e trasmette i risultati.Come posso trasformare un lavandino in un condotto?
attoparsec-conduit offre sinkParser
per trasformare un Parser
in un Sink
, ma come posso trasformare questo in un Sink
Conduit
? Quello che sto cercando è una funzione come:
conduitSink :: (Resource m) => Sink a m b -> Conduit a m b
che alimenta più volte i dati nel Sink
, producendo ogni risultato come va. Sembra che potrebbe essere scritto abbastanza facilmente come un ciclo manuale, ma mi chiedo se c'è un modo migliore.
La mancanza di questa funzione apparentemente ovvia nella libreria di conduttori mi fa pensare che potrei fare qualcosa di sbagliato; c'è un modo migliore per farlo? Il caso d'uso sta trasformando byte grezzi nella forma analizzata di un protocollo di rete basato su messaggi, da elaborare nelle fasi successive della pipeline. Ho già la direzione opposta (ad esempio Conduit T m ByteString
) grazie a blaze-builder-conduit, quindi questo sembrava il modo più naturale per strutturare le cose.
Grazie, ci provo. Questo significa che non userò affatto condoparsec-conduit?In tal caso, ci sarebbe un ostacolo all'aggiunta di un generico 'conduitParser :: (AttoparsecInput a, ResourceThrow m) => Parser a b -> Conduit a m b' alla sua interfaccia usando questa tecnica, o è una semplice omissione? – ehird
@ehird, credo che sia semplicemente un'omissione; l'attuale codice 'sinkParser' suggerisce che potrebbe essere facilmente trasformato per analizzare il flusso di input più volte, poiché utilizza una tecnica simile a quella descritta sopra, ma solo che smette di consumare input dopo la prima analisi. – dflemstr
In effetti, sembra che ci sia già [una richiesta di pull] (https://github.com/snoyberg/conduit/pull/11) aggiungendo 'conduitParser' ad attoparsec-enumerator; Probabilmente userò questa implementazione. Grazie per avermi informato di 'SequencedSink', a proposito; L'ho passato mentre leggevo la documentazione. – ehird