मैं एक पाइप से 50 आइटम तक के समूह को पढ़ने की कोशिश कर रहा हूं और उन्हें एक बार में एक आईओ क्रिया में संसाधित कर रहा हूं। (इसके लिए उपयोग का मामला है कि मैं डेटाबेस में डेटा डालने की कोशिश कर रहा हूं और मैं एक लेनदेन के अंदर एक संपूर्ण बैच करना चाहता हूं क्योंकि यह काफी अधिक कुशल है)। यहाँ मैं अब तक क्या मिल गया है की एक सरलीकृत संस्करण है:पाइप के साथ इनपुट के अंत का पता लगाने के लिए
type ExampleType = Int
doSomething :: [ExampleType] -> IO()
doSomething = undefined
inGroupsOf50 :: Monad m => Producer ExampleType m() -> m()
inGroupsOf50 input =
runEffect $ input >-> loop
where loop = do entries <- replicateM 50 await
lift $ doSomething entries --Insert a bunch all in one transaction
loop
समस्या जहाँ तक मैं बता सकता है, जब तक सम्मिलित करने के लिए आइटम्स की संख्या 50 से विभाजित करने के लिए होता है, मैं याद करने जा रहा हूँ कुछ। replicateM 50 await
की बजाय मैं वास्तव में क्या चाहता हूं वह कुछ ऐसा है जो इनपुट समाप्त होने पर मुझे 50 आइटम या उससे कम तक देता है लेकिन मैं इसे लिखने के बारे में बिल्कुल नहीं समझ सकता।
मुझे लगता है कि pipes-parse देखने के लिए सही लाइब्रेरी हो सकती है। draw
में एक आशाजनक हस्ताक्षर दिखता है ... लेकिन अभी तक सभी बिट्स मेरे सिर में एक साथ फिट नहीं हैं। मेरे पास producer
है, मैं consumer
लिख रहा हूं और मुझे वास्तव में यह नहीं मिलता है कि यह parser
की अवधारणा से कैसे संबंधित है।