!iWZ)      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                      None_g=entwineIdentifier version of  .entwineLogical disjunction.entwineLogical conjunction.entwine O(n log n)' Remove duplicate elements from a list.Unlike , this version requires ! and runs in  O(n log n) instead of O(n). Like = the output order is identical to the input order. See sortNub for nub behaviour with sorted output. ordNub "foo bar baz" == "fo barz" ordNub [3,2,1,2,1] == [3,2,1] List.take 3 (ordNub [4,5,6,undefined]) == [4,5,6] ordNub xs == List.nub xsentwine O(n log n) Behaves exactly like 6 except it uses a user-supplied comparison function. ordNubBy (comparing length) ["foo","bar","quux"] == ["foo","quux"] ordNubBy (comparing fst) [("foo", 10),("foo", 20),("bar", 30)] == [("foo", 10),("bar", 30)] }    ! "utsr#$%bhia`fec\[d^]_jg&MKLJ'()69*+,-./012783<=>45:;B@?ADCEFGHINOPQRSTUVWXYZklmnopqvwxyz{|~)69v*1,-./0}4+'(|{zB@?A$NV  EXFGUDC5:;po278OQRkl   "utsrnm#~%bhia`fec\[d^]_jgYWPTS! 3<=>q&MKLJIHZwyx88None$entwineA queue is an abstract type, representing a simple bounded FIFO channel that can only have its state queried in a non-blocking manner.qThis useful for implementing things like passing data between a producer and consumer process with back presure.None(entwineyA pin is an abstract type, representing a simple barrier that can only have its state queried in a non-blocking manner.gThis useful for implementing things like passing in a hook to terminate or stop waiting for a process.None)entwineentwine None-entwinezA gate is an abstract type, representing a simple barrier that can only have its state queried in a non-blocking manner.XThis useful for implementing things like passing in a gate to terminate or stop a loop.None.entwine5A callback which can be invoked to cleanup a resourceNone31entwinenA Duration is an abstract type, representing a short delay (in the region of micro-seconds to a few minutes).This useful for implementing concurrency and process primitives that need to wait for short periods to ensure fairness (for example). None3%None5entwineSnooze for a short duration  None_6[entwine*Loop with a delay until the gate is closed NoneLentwinePRun an action forever, using termination handler to notify of failure events.RThis is generally most useful to guard a thread against un-noticed termination.A reasonable usage would be to add monitoring / notifications in termination handler and just let this loop keep your code alive. It is recommened that you use the termination handler to control number of retried.An equally reasonable alternative is to call exitImmediately (or some equivalent - perhaps you have an MVar controlling program termination?), and use this to ensure that the entire process dies if any of the supervised threads die.The action passed to j should run forever, if you want to run a short-lived action repeatedly in a supervised fashion see ,. This function will still work, but the  handler will be called (a lot).BCommon usage (where expectation is the do block never return): d void . forkIO . guard (TerminationHandler ...) . forever $ do doThis andThis entwinesRun an action repeatedly with a fixed delay between runs, using termination handler to notify of failure events.See \ for more description. This offers the same behaviour for actions that don't run forever.BCommon usage (where expectation is the do block does returns): k void . forkIO . repeatedly (seconds 5) (TerminationHandler ...) $ do doThis andThis   NoneX_M[ None2XgYentwineProvide a producer and an action to be run across the result of that producer in parallel. For a version that doesn't ignore the results see . Common usage:  let producer :: Address -> Queue Address -> IO () producer prefix q = list' prefix $$ writeQueue q consume producer 100 ((a :: Address) -> doThis) entwineProvide a producer and an action to be run across the results of that producer in parallel and collect the results. For a version that ignores the results see . Common usage:  let producer :: Address -> Queue Address -> IO Int producer prefix q = list' prefix $$ writeQueue q consume producer 100 ((a :: Address) -> doThis)       NoneY& !"#$%$&'()*+,"-". /0123456789$:;<=$>?@ABCDEFGHIJKJLJMJNOPOQOROSTUVWXJYZ[\]J^W_W`Ja\b\cJdJeJfghgigjgklmln o p qFrFsFtFuFvFwxyDzD{D|D}D~DDDDDDDDDDDDDDDDDDDDDDD\\????"AAAAA$$$$$$$$$$      !"#$%&'( ) * * + , - . / 0 1 2 3 4 5 5 6 7 8 9 : ; < = > ? @ A B C DE$entwine-0.0.4-2NZR2a7LUmA7IqeM8r0C7S Entwine.PEntwine.Data.QueueEntwine.Data.PinEntwine.Data.ParallelEntwine.Data.GateEntwine.Data.FinalizerEntwine.Data.DurationEntwine.Snooze Entwine.Loop Entwine.Guard Entwine.AsyncEntwine.Parallel Control.Monad=<< Data.Listnub Entwine.DataEntwineghc-primGHC.PrimseqbaseGHC.Listfilter Data.TuplefstsndGHC.Base otherwise$GHC.Num fromInteger-GHC.Real fromRational GHC.Classes==>=negatefail>>=>>fmapreturn fromIntegral toIntegerguard<>memptymappendmconcatjoin<*>pure*>GHC.EnumEnumEqMonadFunctorNumOrdGHC.ReadReadGHC.ShowShow Applicative Data.FoldableFoldableData.Traversable Traversable SemigroupMonoid GHC.TypesBoolCharDoubleIntGHC.IntInt8Int16Int32Int64 integer-gmpGHC.Integer.TypeInteger GHC.MaybeMaybeOrderingGHC.WordWord64 Data.EitherEitherFalseNothingJustTrueLeftRightLTEQGTData.Bifunctorsecondfirstbimap BifunctorControl.Monad.IO.ClassliftIOMonadIOunlessforeverfilterMforMforsequencemapM sequenceAtraverseControl.ApplicativeoptionalnotElemallanyand concatMapconcatmsumasumforM_mapM_for_ traverse_productsumminimummaximumelemlengthnulltoListfoldl1foldr1foldl'foldlfoldr'foldrfoldMapfold Data.OldList intercalate isPrefixOf Text.Read readMaybe readEitherisRighteitherData.Ord comparing readListPrecreadPrecreadList readsPrec Data.Boolbool Data.Function&onfix Data.Functorvoid$><$>div showStringShowSshowListshow showsPrecreversebreaksplitAtdrop Data.MaybemapMaybe catMaybes listToMaybe fromMaybe isNothingisJustmaybeuncurrycurrysignumabs*+$!flip.constidliftMwhen<**>stimessconcat<$<*liftA2manysome<|>empty Alternativemplusmzero MonadPlus/=<=compare&&||not<>maxmin text-1.2.3.1Data.Text.InternalText undefinederrortracetraceMtraceIOwithwhenMunlessMifMguardMbindheadorAandA maybeToRight rightToMaybeordNubordNubBy $fOrdUserOrd $fEqUserOrdQueuenewQueue readQueue tryReadQueue writeQueue isQueueEmptyPinnewPincheckPin waitForPinpullPinWorkersResult newResult emptyResult addResult getResult emptyWorkers failWorkers getWorkers addWorkerwaitForWorkerswaitForWorkers'GatenewGateisOpenclose Finalizerfinalize$fMonoidFinalizer$fSemigroupFinalizerDuration microseconds millisecondssecondsminuteshourstoMicrosecondstoMilliseconds toSeconds toMinutestoHours $fEqDuration$fShowDurationsnoozeloopTerminationHandler onExplosiononError onGracefulTerminationActionRestartDieguarded repeatedly$fEqTerminationAction$fShowTerminationAction AsyncTimeoutrenderAsyncTimeoutwaitWithTimeoutwaitEitherBoth$fEqAsyncTimeout$fShowAsyncTimeoutRunError WorkerError BlowUpErrorconsume_renderRunErrorconsume$fExceptionEarlyTermination$fShowRunError$fEqEarlyTermination$fShowEarlyTermination