मुझे पता है कि हैकेज पर कम से कम एक लाइब्रेरी है जिसमें इस कार्य के लिए कुछ पूर्व निर्मित मोनैड ट्रांसफार्मर हैं, लेकिन जब मैं एक की आवश्यकता होती हूं तो मैं आमतौर पर पाइप पैकेज में बदल जाता हूं। मैं पाइप-4.0.0 का उपयोग कर रहा हूं, यह इस सप्ताह के अंत में हैकेज पर होगा, लेकिन इससे पहले कि आप इसे github repo फॉर्म कर सकें।
मैं भी इस्तेमाल किया terminal-progress-bar package so that it makes a nice terminal animation as well.
{-# language BangPatterns #-}
import Pipes
import qualified Pipes.Prelude as P
import Control.Monad.IO.Class
import System.ProgressBar
import System.IO (hSetBuffering, BufferMode(NoBuffering), stdout)
-- | Takes the total size of the stream to be processed as l and the function
-- to map as fn
progress l = loop 0
where
loop n = do
liftIO $ progressBar (msg "Working") percentage 40 n l
!x <- await -- bang pattern to make strict
yield x
loop (n+1)
main = do
-- Force progress bar to print immediately
hSetBuffering stdout NoBuffering
let n = 10^6
let heavy x = last . replicate n $ x -- time wasting function
r <- P.toListM $ each [1..100] >-> P.map heavy >-> progress 100
putStrLn ""
return r
यह एनिमेट:
> Working [=>.......................] 7%
> Working [=====>...................] 20%
हर अद्यतन पिछले बार मिटा देता है तो यह केवल टर्मिनल पर एक लाइन तक लगते हैं। फिर यह इस तरह खत्म होता है:
> main
Working [=========================] 100%
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]
ध्यान दें कि यह 'toListM' के उपयोग के कारण बड़ी सूचियों पर बह जाएगा। निरंतर मेमोरी में परिणामों को स्ट्रीम करने के लिए आप 'for' लूप का उपयोग कर सकते हैं जैसे 'runEffect $ (प्रत्येक [1..100]> -> पी। मैप भारी> -> प्रगति 100) (लिफ्ट प्रिंट)' या आप 'पी.प्रिंट' सुविधा 'उपभोक्ता' का उपयोग कर सकते हैं। –
@ गैब्रियल गोंज़ालेज़ - मुझे क्या याद है कि एक आलसी सूची में पाइप को स्ट्रीम करने का सबसे अच्छा तरीका एक आलसी लेखक मोनैड के साथ था, आलसी लेखक मोनद में निर्मित आलसी पर्याप्त नहीं था। आलसी सूची में स्ट्रीमिंग के लिए कोई बेहतर तरीका है? – Davorak
'toList' पुराने आलसी लेखक मोनैड चाल को प्रतिस्थापित करता है, हालांकि उन दो समाधानों में से कोई भी शुद्ध और आलसी सूची में' निर्माता 'को अशुद्ध नहीं कर सकता है। हालांकि, इसकी कोई ज़रूरत नहीं है, क्योंकि 'निर्माता' ** ** आभासी आलसी सूची है जो आप चाहते हैं और बेवकूफ चीज सिर्फ इसे 'निर्माता' के रूप में छोड़ना है। –