!]N      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                      None]e=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 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%? None)GentwinezA 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 resourceNone.entwinenA 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). None/m%None07  None]1wentwine*Loop with a delay until the gate is closed NoneGentwinePRun 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   NoneV]Hw None1VMentwine]Provide a producer and an action to be run across the result of that producer in parallel.Common usage: @ let producer :: Address -> Queue Address -> IO () producer prefix q = list' prefix $$ writeQueue q4consume producer 100 ((a :: Address) -> doThis) @      NoneN & !"#$%$&'()*+,"-". /0123456789$:;<=$>?@ABCDEFGHIJKJLJMJNOPOQOROSTUVWJXYZ[\J]^_J`[a[bJcJdJefgfhfifjklkm n o pFqFrFsFtFuFvwxDyDzD{D|D}D~DDDDDDDDDDDDDDDDDDDDDD[[????"AAAAA$$$$$$$$$$      !"#$%&' ( ) ) * + , - . / 0 1 2 3 4 4 5 6 7 8 9 : ; < = > ? @ A B CD#entwine-0.0.2-n4Xcuf6djOJbv8CZ9Jx6M 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.TypeIntegerMaybeOrderingGHC.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.0Data.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