package Ġprop Check Ċ Ċ import Ġarrow . Kind Ċ import Ġarrow . core .* Ċ import Ġarrow . core . extensions . either . applic ative . applic ative Ċ import Ġarrow . core . extensions . id . traverse . traverse Ċ import Ġarrow . core . extensions . list . functor Filter . filter Map Ċ import Ġarrow . core . extensions . sequence . fold able . fold Right Ċ import Ġarrow . fx . IO Ċ import Ġarrow . fx . extensions . fx Ċ import Ġarrow . fx . extensions . io . functor . unit Ċ import Ġarrow . fx . extensions . io . mon ad . mon ad Ċ import Ġarrow . fx . fix Ċ import Ġarrow . mt l . Option TP art ial Of Ċ import Ġarrow . mt l . value Ċ import Ġarrow . recursion . el got M Ċ import Ġarrow . type classes . Functor Ċ import Ġarrow . type classes . Monad Ċ import Ġk parse c . render Pretty Ċ import Ġk parse c . run Parser Ċ import Ġk parse c . stream Ċ import Ġpretty .* Ċ import Ġprop Check . ar bitrary .* Ċ import Ġprop Check . pretty . K Value Ċ import Ġprop Check . pretty . list Parser Ċ import Ġprop Check . property .* Ċ import Ġprop Check . property . Failure Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* ĠTODO ĠUnsigned Ġtype Ġinstances Ġfor Ġco ar bitrary Ġand Ġfunction . ĠAlso Ġgenerators Ġfor Ġunsigned Ġtypes Ċ Ġ* ĠTODO ĠGen 's Ġand Ġinstances Ġfor Ġarrow Ġtypes Ċ Ġ* ĠTODO 's Ċ Ġ* Ġ- Ġshrink ing Ċ Ġ* Ġ Ġ- Ġpretty Ġprint Ġshrink - trees / gens Ċ Ġ* Ġ- ĠtoString () Ġoutput Ġpretty Ġprinter Ċ Ġ* Ġ Ġ- Ġmove Ġto Ġnew Ġlib Ġto Ġallow Ġindependent Ġuse Ċ Ġ*/ Ċ fun Ġcheck Group ( groupName : ĠString , Ġprops : ĠList < Tuple 2 < String , ĠProperty >> ): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġdetect Config (). flatMap Ġ{ Ġcheck Group ( it , ĠgroupName , Ġprops ) Ġ} Ċ Ċ fun Ġcheck Group ( config : ĠConfig , ĠgroupName : ĠString , Ġprops : ĠList < Tuple 2 < String , ĠProperty >> ): ĠIO < Boolean > Ġ= ĠIO . fx Ġ{ ĊĠĠĠ Ġ! effect Ġ{ Ġprintln (" âĶģâĶģ âĶģ Ġ$ groupName ĠâĶ ģ âĶģâĶģ ") Ġ} ĊĊĠĠĠ Ġval Ġsummary Ġ= ĊĠĠĠĠĠĠĠ Ġprops . fold ( IO Ġ{ ĠSummary . mon oid (). empty (). copy ( waiting Ġ= ĠProperty Count ( props . size )) Ġ}) Ġ{ Ġacc , Ġ( n , Ġprop ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO . fx Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Summary Ġ= Ġacc . bind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġcheck Report ( config , ĠProperty Name ( n ). some (), Ġprop ). bind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSummary . mon oid (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Summary Ġ+ Ġempty (). copy ( waiting Ġ= ĠProperty Count (- 1 )) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( res . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Failure Ġ-> Ġempty (). copy ( failed Ġ= ĠProperty Count ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Success Ġ-> Ġempty (). copy ( successful Ġ= ĠProperty Count ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult . Given Up Ġ-> Ġempty (). copy ( g ave Up Ġ= ĠProperty Count ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. bind () ĊĊĠĠĠ Ġsummary . failed . un Property Count Ġ== Ġ 0 Ġ&& Ġsummary . g ave Up . un Property Count Ġ== Ġ 0 Ċ } Ċ Ċ fun Ġcheck ( property Config : ĠProperty Config Ġ= ĠProperty Config (), Ġc : Ġsuspend ĠProperty Test Syntax . () Ġ-> ĠUnit ): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġcheck ( property ( property Config , Ġc )) Ċ Ċ fun Ġcheck ( ĊĠĠĠ Ġconfig : ĠConfig , ĊĠĠĠ Ġproperty Config : ĠProperty Config Ġ= ĠProperty Config (), ĊĠĠĠ Ġc : Ġsuspend ĠProperty Test Syntax . () Ġ-> ĠUnit Ċ ): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġcheck ( config , Ġproperty ( property Config , Ġc )) Ċ Ċ fun Ġcheck ( prop : ĠProperty ): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġdetect Config (). flatMap Ġ{ Ġcheck ( it , Ġprop ) Ġ} Ċ Ċ fun Ġcheck ( config : ĠConfig , Ġprop : ĠProperty ): ĠIO < Boolean > Ġ= Ġcheck ( config , ĠNone , Ġprop ) Ċ Ċ fun Ġre check ( size : ĠSize , Ġseed : ĠRand Seed , Ġprop : ĠProperty ): ĠIO < Unit > Ġ= ĊĠĠĠ Ġdetect Config (). flatMap Ġ{ Ġre check ( it , Ġsize , Ġseed , Ġprop ) Ġ} Ċ Ċ fun Ġre check ( ĊĠĠĠ Ġsize : ĠSize , ĊĠĠĠ Ġseed : ĠRand Seed , ĊĠĠĠ Ġproperty Config : ĠProperty Config Ġ= ĠProperty Config (), ĊĠĠĠ Ġc : Ġsuspend ĠProperty Test Syntax . () Ġ-> ĠUnit Ċ ): ĠIO < Unit > Ġ= ĊĠĠĠ Ġre check ( size , Ġseed , Ġproperty ( property Config , Ġc )) Ċ Ċ fun Ġre check ( ĊĠĠĠ Ġconfig : ĠConfig , ĊĠĠĠ Ġsize : ĠSize , ĊĠĠĠ Ġseed : ĠRand Seed , ĊĠĠĠ Ġproperty Config : ĠProperty Config Ġ= ĠProperty Config (), ĊĠĠĠ Ġc : Ġsuspend ĠProperty Test Syntax . () Ġ-> ĠUnit Ċ ): ĠIO < Unit > Ġ= ĊĠĠĠ Ġre check ( config , Ġsize , Ġseed , Ġproperty ( property Config , Ġc )) Ċ Ċ fun Ġre check ( config : ĠConfig , Ġsize : ĠSize , Ġseed : ĠRand Seed , Ġprop : ĠProperty ): ĠIO < Unit > Ġ= ĊĠĠĠ Ġcheck Report ( seed , Ġsize , Ġconfig , ĠNone , Ġprop ). unit () Ċ Ċ fun Ġcheck Named ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġproperty Config : ĠProperty Config Ġ= ĠProperty Config (), ĊĠĠĠ Ġc : Ġsuspend ĠProperty Test Syntax . () Ġ-> ĠUnit Ċ ): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġcheck Named ( name , Ġproperty ( property Config , Ġc )) Ċ Ċ fun Ġcheck Named ( name : ĠString , Ġprop : ĠProperty ): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġdetect Config (). flatMap Ġ{ Ġcheck ( it , ĠProperty Name ( name ). some (), Ġprop ) Ġ} Ċ Ċ fun Ġcheck Named ( ĊĠĠĠ Ġconfig : ĠConfig , ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġproperty Config : ĠProperty Config Ġ= ĠProperty Config (), ĊĠĠĠ Ġc : Ġsuspend ĠProperty Test Syntax . () Ġ-> ĠUnit Ċ ): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġcheck ( config , ĠProperty Name ( name ). some (), Ġproperty ( property Config , Ġc )) Ċ Ċ fun Ġcheck Named ( config : ĠConfig , Ġname : ĠString , Ġprop : ĠProperty ): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġcheck ( config , ĠProperty Name ( name ). some (), Ġprop ) ĊĊ Ċ fun Ġcheck ( config : ĠConfig , Ġname : ĠOption < PropertyName >, Ġprop : ĠProperty ): ĠIO < Boolean > Ġ= ĊĠĠĠ Ġcheck Report ( config , Ġname , Ġprop ). map Ġ{ Ġit . status Ġis ĠResult . Success Ġ} Ċ Ċ fun Ġcheck Report ( name : ĠOption < PropertyName >, Ġprop : ĠProperty ): ĠIO < Report < Result >> Ġ= ĊĠĠĠ Ġdetect Config (). flatMap Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠ ĠIO Ġ{ ĠRand Seed ( Random . next Long ()) Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Report ( it , ĠSize ( 0 ), Ġc , Ġname , Ġprop ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ fun Ġcheck Report ( config : ĠConfig , Ġname : ĠOption < PropertyName >, Ġprop : ĠProperty ): ĠIO < Report < Result >> Ġ= ĊĠĠĠ ĠIO Ġ{ ĠRand Seed ( Random . next Long ()) Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Report ( it , ĠSize ( 0 ), Ġconfig , Ġname , Ġprop ) ĊĠĠĠ Ġ} Ċ Ċ internal Ġfun Ġcheck Report ( ĊĠĠĠ Ġseed : ĠRand Seed , ĊĠĠĠ Ġsize : ĠSize , ĊĠĠĠ Ġconfig : ĠConfig , ĊĠĠĠ Ġname : ĠOption < PropertyName >, ĊĠĠĠ Ġprop : ĠProperty Ċ ): ĠIO < Report < Result >> Ġ= ĊĠĠĠ ĠIO . fx Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġ! run Property ( IO . mon ad (), Ġsize , Ġseed , Ġprop . config , Ġprop . prop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠLive Ġupdate Ġwill Ġcome Ġback Ġonce ĠI Ġfinish Ġconcurrent Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIO . unit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ! IO Ġ{ Ġprintln ( report . render Result ( config . use Color , Ġname )) Ġ} ĊĠĠĠĠĠĠĠ Ġreport ĊĠĠĠ Ġ}. fix () Ċ Ċ // Ġ---------------- ĠRunning Ġa Ġsingle Ġproperty Ċ data Ġclass ĠState ( ĊĠĠĠ Ġval Ġnum Tests : ĠTest Count , ĊĠĠĠ Ġval Ġnum Dis cards : ĠDis card Count , ĊĠĠĠ Ġval Ġsize : ĠSize , ĊĠĠĠ Ġval Ġseed : ĠRand Seed , ĊĠĠĠ Ġval Ġcoverage : ĠCoverage < Cover Count > Ċ ) Ċ Ċ // ĠTODO Ġalso Ġclean Ġthis Ġup ... Ġsplit Ġit Ġapart Ġetc Ċ fun Ġ< M > Ġrun Property ( ĊĠĠĠ ĠMM : ĠMonad < M >, ĊĠĠĠ Ġinitial Size : ĠSize , ĊĠĠĠ Ġinitial Seed : ĠRand Seed , ĊĠĠĠ Ġconfig : ĠProperty Config , ĊĠĠĠ Ġprop : ĠProperty T < M , ĠUnit >, ĊĠĠĠ Ġhook : Ġ( Report < Progress >) Ġ-> ĠKind < M , ĠUnit > Ċ ): ĠKind < M , ĠReport < Result >> Ġ{ ĊĠĠĠ Ġval Ġ( confidence , Ġmin Tests ) Ġ= Ġwhen Ġ( config . termination Criteria ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠEarly Termination Ġ-> Ġconfig . termination Criteria . confidence . some () Ġto ĠTest Limit ( config . termination Criteria . limit ) ĊĠĠĠĠĠĠĠ Ġis ĠNo Early Termination Ġ-> Ġconfig . termination Criteria . confidence . some () Ġto ĠTest Limit ( config . termination Criteria . limit ) ĊĠĠĠĠĠĠĠ Ġis ĠNo Confidence Termination Ġ-> ĠNone Ġto ĠTest Limit ( config . termination Criteria . limit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsuccess Verified ( test Count : ĠTest Count , Ġcoverage : ĠCoverage < Cover Count >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġtest Count . un Test Count . rem ( 1 0 0 ) Ġ== Ġ 0 Ġ&& Ġconfidence . fold ({ Ġfalse Ġ}, Ġ{ Ġit . success ( test Count , Ġcoverage ) Ġ}) ĊĊĠĠĠ Ġfun Ġfailure Verified ( test Count : ĠTest Count , Ġcoverage : ĠCoverage < Cover Count >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġtest Count . un Test Count . rem ( 1 0 0 ) Ġ== Ġ 0 Ġ&& Ġconfidence . fold ({ Ġfalse Ġ}, Ġ{ Ġit . failure ( test Count , Ġcoverage ) Ġ}) ĊĊĠĠĠ Ġreturn ĠState ( ĊĠĠĠĠĠĠĠ ĠTest Count ( 0 ), ĊĠĠĠĠĠĠĠ ĠDis card Count ( 0 ), ĊĠĠĠĠĠĠĠ Ġinitial Size , ĊĠĠĠĠĠĠĠ Ġinitial Seed , ĊĠĠĠĠĠĠĠ ĠCoverage . mon oid ( Cover Count . sem ig roup ()). empty () ĊĠĠĠ Ġ). el got M ({ ĠMM . just ( it . value ()) Ġ}, Ġ{ Ġ( num Tests , Ġnum Dis cards , Ġsize , Ġseed , Ġcurr Coverage ) Ġ-> ĊĠĠĠĠĠĠĠ ĠMM . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhook ( Report ( num Tests , Ġnum Dis cards , Ġcurr Coverage , ĠProgress . Running )). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoverage Reached Ġ= Ġsuccess Verified ( num Tests , Ġcurr Coverage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoverage Un reachable Ġ= Ġfailure Verified ( num Tests , Ġcurr Coverage ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenough Tests Run Ġ= Ġwhen Ġ( config . termination Criteria ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEarly Termination Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Tests . un Test Count Ġ>= Ġdefault Min Tests . un Test Limit Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( coverage Reached Ġ|| Ġcoverage Un reachable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNo Early Termination Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Tests . un Test Count Ġ>= Ġmin Tests . un Test Limit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNo Confidence Termination Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Tests . un Test Count Ġ>= Ġmin Tests . un Test Limit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . un Size Ġ> Ġ 9 9 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMM . just ( Id ( State ( num Tests , Ġnum Dis cards , ĠSize ( 0 ), Ġseed , Ġcurr Coverage )). right ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenough Tests Run Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfailure Rep ( msg : ĠDoc < Markup >): ĠReport < Result > Ġ= ĠReport ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Tests , Ġnum Dis cards , Ġcurr Coverage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Failure ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFailure Summary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , Ġseed , ĠSh rink Count ( 0 ), Ġmsg , Ġempty List (), Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Rep Ġ= ĠReport ( num Tests , Ġnum Dis cards , Ġcurr Coverage , ĠResult . Success ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabels Cover ed Ġ= Ġcurr Coverage . coverage Success ( num Tests ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfidence Report Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( coverage Reached Ġ&& Ġlabels Cover ed ) Ġsuccess Rep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfailure Rep (" Test Ġcoverage Ġcannot Ġbe Ġreached Ġafter ". text () Ġsp aced Ġnum Tests . test Count ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Rep Ġ= Ġwhen Ġ( config . termination Criteria ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEarly Termination Ġ-> Ġconfidence Report ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNo Early Termination Ġ-> Ġconfidence Report ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNo Confidence Termination Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( labels Cover ed ) Ġsuccess Rep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfailure Rep (" Labels Ġnot Ġsufficient ly Ġcovered Ġafter ". text () Ġsp aced Ġnum Tests . test Count ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMM . just ( final Rep . left ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Dis cards . un Discard Count Ġ>= Ġconfig . max Discard Ratio . un Discard Ratio Ġ* Ġnum Tests . un Test Count . coerce At Least ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Tests . un Test Limit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMM . just ( Report ( num Tests , Ġnum Dis cards , Ġcurr Coverage , ĠResult . Given Up ). left ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġseed . split (). let Ġ{ Ġ( s 1 , Ġs 2 ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġcatch Ġerrors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMM . fx . mon ad Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġ! prop . un Property T . run Test T ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value () Ġ// ĠEither T ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value (). fix () Ġ// ĠWriter T ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Gen ( s 1 Ġto T Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run R ose ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value () Ġ// ĠOption T ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . fold ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdiscard ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠId ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Tests , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDis card Count ( num Dis cards . un Discard Count Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSize ( size . un Size Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Coverage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). right () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . res . let Ġ{ Ġ( log , Ġresult ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . fold ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshrink Ġfailure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshrink Res Ġ= Ġ! shrink Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . shrink Limit . un Shrink Limit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . shrink Retries . un Shrink Retries , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . some (). unwrap ( MM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhook ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Count ( num Tests . un Test Count Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Dis cards , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Coverage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress . Shrink ing ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Count ( num Tests . un Test Count Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Dis cards , Ġcurr Coverage , Ġshrink Res ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). left () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtest Ġsuccess ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Cover Ġ= ĠCoverage . mon oid ( Cover Count . sem ig roup ()). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . coverage () Ġ+ Ġcurr Coverage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠId ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Count ( num Tests . un Test Count Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Dis cards , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSize ( size . un Size Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Cover ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). right () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĠId . traverse (), ĠMM ) Ċ } Ċ Ċ data Ġclass ĠSh rink State < M >( ĊĠĠĠ Ġval Ġnum Shrink s : ĠSh rink Count , ĊĠĠĠ Ġval Ġnode : ĠR ose F < Option < Tuple 2 < Log , ĠEither < Failure , ĠUnit >> >, ĠR ose < M , ĠOption < Tuple 2 < Log , ĠEither < Failure , ĠUnit >> >>> Ċ ) Ċ Ċ // ĠTODO Ġinline Ġclasses Ġfor Ġparams Ċ fun Ġ< M > Ġshrink Result ( ĊĠĠĠ ĠMM : ĠMonad < M >, ĊĠĠĠ Ġsize : ĠSize , ĊĠĠĠ Ġseed : ĠRand Seed , ĊĠĠĠ Ġshrink Limit : ĠInt , ĊĠĠĠ Ġshrink Retries : ĠInt , ĊĠĠĠ Ġnode : ĠR ose F < Option < Tuple 2 < Log , ĠEither < Failure , ĠUnit >> >, ĠR ose < M , ĠOption < Tuple 2 < Log , ĠEither < Failure , ĠUnit >>>> >, ĊĠĠĠ Ġhook : Ġ( Failure Summary ) Ġ-> ĠKind < M , ĠUnit > Ċ ): ĠKind < M , ĠResult > Ġ= ĊĠĠĠ ĠSh rink State ( Shrink Count ( 0 ), Ġnode ). el got M ({ ĠMM . just ( it . value ()) Ġ}, Ġ{ Ġ( num Shrink s , Ġcurr ) Ġ-> ĊĠĠĠĠĠĠĠ ĠMM . fx . mon ad Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurr . res . fold ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Given Up . left () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġ( log , Ġresult ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . fold ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsummary Ġ= ĠFailure Summary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , Ġseed , Ġnum Shrink s , Ġit . un Failure , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ= Ġlog . un Log . filter Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠJournal Entry . Annot ate ) ĠFailure Annotation . Annotation ( it . text ). some () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( it Ġis ĠJournal Entry . Input ) ĠFailure Annotation . Input ( it . text ). some () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠNone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfoot notes Ġ= Ġlog . un Log . filter Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠJournal Entry . Foot note ) Ġit . text . some () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠNone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhook ( summary ). bind () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num Shrink s . un Shrink Count Ġ>= Ġshrink Limit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Failure ( summary ). left () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcurr . sh run k . fold Right < R ose < M , ĠOption < Tuple 2 < Log , ĠEither < Failure , ĠUnit >> >>, ĠKind < M , ĠEither < Result , ĠId < Shrink State < M >>>> >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEval . now ( MM . just ( Result . Failure ( summary ). left ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġv , Ġacc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEval . now ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMM . fx . mon ad Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġv . run Tree N ( MM , Ġshrink Retries ). bind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r . is Failure ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠId ( Shrink State ( Shrink Count ( num Shrink s . un Shrink Count Ġ+ Ġ 1 ), Ġr )). right () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġacc . value (). bind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. value (). bind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĠResult . Success . left () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĠId . traverse (), ĠMM ) Ċ Ċ fun Ġ< M , ĠA , ĠL , ĠW > ĠR ose < M , ĠOption < Tuple 2 < W , ĠEither < L , ĠA >>>> . run Tree N ( ĊĠĠĠ ĠMM : ĠMonad < M >, ĊĠĠĠ Ġretries : ĠInt Ċ ): ĠKind < M , ĠR ose F < Option < Tuple 2 < W , ĠEither < L , ĠA >> >, ĠR ose < M , ĠOption < Tuple 2 < W , ĠEither < L , ĠA >>>> >> Ġ= ĊĠĠĠ ĠMM . fx . mon ad Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġrun R ose . bind () ĊĠĠĠĠĠĠĠ Ġif Ġ( retries Ġ> Ġ 0 Ġ&& Ġr . is Failure (). not ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Tree N ( MM , Ġretries Ġ- Ġ 1 ). bind () ĊĠĠĠĠĠĠĠ Ġelse Ġr ĊĠĠĠ Ġ} Ċ Ċ fun Ġ< M , ĠA > ĠOption < R ose F < A , ĠR ose < Option TP art ial Of < M >, ĠA >> >. unwrap ( FF : ĠFun ctor < M >): ĠR ose F < Option < A >, ĠR ose < M , ĠOption < A >>> Ġ= ĊĠĠĠ Ġfold ({ ĊĠĠĠĠĠĠĠ ĠR ose F ( None , Ġempty Sequence ()) ĊĠĠĠ Ġ}, Ġ{ ĠR ose F ( it . res . some (), Ġit . sh run k . map Ġ{ ĠFF . run Ġ{ ĠR ose ( it . run R ose . value (). map Ġ{ Ġit . unwrap ( FF ) Ġ}) Ġ} Ġ}) Ġ}) Ċ Ċ fun Ġ< M , ĠA , ĠL , ĠW > ĠR ose F < Option < Tuple 2 < W , ĠEither < L , ĠA >> >, ĠM >. is Failure (): ĠBoolean Ġ= ĊĠĠĠ Ġres . fold ({ Ġfalse Ġ}, Ġ{ Ġit . b . is Left () Ġ}) Ċ