package Ġpretty Ċ Ċ public Ġtype alias ĠEval < A > Ġ= ĠAnd Then < Unit , ĠA > Ċ Ċ public Ġfun Ġ< A > ĠAnd Then . Companion . now ( a : ĠA ): ĠEval < A > Ġ= ĠAnd Then Ġ{ Ġa Ġ} Ċ public Ġfun Ġ< A > ĠAnd Then . Companion . later ( f : Ġ() Ġ-> ĠA ): ĠEval < A > Ġ= ĠAnd Then . Single ({ Ġf () Ġ}, Ġ 0 ) Ċ public Ġfun Ġ< A > ĠAnd Then . Companion . defer ( f : Ġ() Ġ-> ĠEval < A >): ĠEval < A > Ġ= ĊĠĠĠ ĠAnd Then . Single < Unit , ĠAnd Then < Unit , ĠA >> ({ Ġf () Ġ}, Ġ 0 ). flatMap Ġ{ Ġit Ġ} Ċ Ċ public Ġoperator Ġfun Ġ< A > ĠEval < A >. invoke (): ĠA Ġ= Ġinvoke ( Unit ) Ċ Ċ public Ġsealed Ġclass ĠAnd Then < in ĠA , Ġout ĠB > Ġ{ ĊĊĠĠĠ Ġinternal Ġclass ĠSingle < A , ĠB >( val Ġf : Ġ( A ) Ġ-> ĠB , Ġval Ġindex : ĠInt ) Ġ: ĠAnd Then < A , ĠB >() ĊĊĠĠĠ Ġinternal Ġclass ĠJoin < A , ĠB >( val Ġfa : ĠAnd Then < A , ĠAnd Then < A , ĠB >>) Ġ: ĠAnd Then < A , ĠB >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" And Then . Join (... )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠConcat < A , ĠE , ĠB >( val Ġleft : ĠAnd Then < A , ĠE >, Ġval Ġright : ĠAnd Then < E , ĠB >) Ġ: ĠAnd Then < A , ĠB >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" And Then . Concat (... )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġpublic Ġoperator Ġfun Ġinvoke ( a : ĠA ): ĠB Ġ= Ġloop ( this Ġas ĠAnd Then < Any ?, ĠAny ? >, Ġa , Ġ 0 ) ĊĊĠĠĠ Ġinternal Ġfun Ġ< X > Ġand Then F ( right : ĠAnd Then < B , ĠX >): ĠAnd Then < A , ĠX > Ġ= ĠConcat ( this , Ġright ) ĊĠĠĠ Ġinternal Ġfun Ġ< X > Ġcompose F ( right : ĠAnd Then < X , ĠA >): ĠAnd Then < X , ĠB > Ġ= ĠConcat ( right , Ġthis ) ĊĊĠĠĠ Ġpublic Ġfun Ġ< X > Ġand Then ( g : Ġ( B ) Ġ-> ĠX ): ĠAnd Then < A , ĠX > Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠF using Ġcalls Ġup Ġto Ġa Ġcertain Ġthreshold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġmax Stack Depth Size ) ĠSingle ({ Ġa : ĠA Ġ-> Ġg ( this ( a )) Ġ}, Ġindex Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġand Then F ( And Then ( g )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġand Then F ( And Then ( g )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġ< C > Ġcompose ( g : Ġ( C ) Ġ-> ĠA ): ĠAnd Then < C , ĠB > Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠF using Ġcalls Ġup Ġto Ġa Ġcertain Ġthreshold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġmax Stack Depth Size ) ĠSingle ({ Ġc : ĠC Ġ-> Ġthis ( g ( c )) Ġ}, Ġindex Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcompose F ( And Then ( g )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcompose F ( And Then ( g )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġoperator Ġfun Ġ< A , ĠB > Ġinvoke ( f : Ġ( A ) Ġ-> ĠB ): ĠAnd Then < A , ĠB > Ġ= ĠSingle ( f , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġmax Stack Depth Size Ġ= Ġ 1 2 7 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġloop ( self : ĠAnd Then < Any ?, ĠAny ? >, Ġcurrent : ĠAny ?, Ġjoins : ĠInt ): ĠB Ġ= Ġwhen Ġ( self ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSingle Ġ-> Ġif Ġ( join s Ġ== Ġ 0 ) Ġself . f ( current ) Ġas ĠB Ġelse Ġloop ( self . f ( current ) Ġas ĠAnd Then < Any ?, ĠAny ? >, Ġnull , Ġjoins Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġis ĠJoin Ġ-> Ġloop ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġself . fa . and Then Ġ{ ĠConcat ( And Then < Any ?, ĠAny ?> Ġ{ Ġcurrent Ġ}, Ġit ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoins Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠConcat < *, Ġ*, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġold Left Ġ= Ġself . left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġold Left Ġas ĠSingle < Any ?, ĠAny ?> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Self Ġ= Ġself . right Ġas ĠAnd Then < Any ?, ĠAny ?> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop ( new Self , Ġleft . f ( current ), Ġjoins ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJoin < *, Ġ* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConcat < *, Ġ*, Ġ*> Ġ-> Ġloop ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotate Accum ulate ( self . left Ġas ĠAnd Then < Any ?, ĠAny ? >, Ġself . right Ġas ĠAnd Then < Any ?, ĠAny ?> ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoins ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġrotate Accum ulate ( ĊĠĠĠĠĠĠĠ Ġleft : ĠAnd Then < Any ?, ĠAny ? >, ĊĠĠĠĠĠĠĠ Ġright : ĠAnd Then < Any ?, ĠAny ?> ĊĠĠĠ Ġ): ĠAnd Then < Any ?, ĠAny ?> Ġ= Ġwhen Ġ( left ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠConcat < *, Ġ*, Ġ*> Ġ-> Ġrotate Accum ulate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft . left Ġas ĠAnd Then < Any ?, ĠAny ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( left . right Ġas ĠAnd Then < Any ?, ĠAny ?> ). and Then F ( right ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠJoin Ġ-> ĠJoin ( left . fa . and Then Ġ{ Ġit . and Then F ( right ) Ġ}) ĊĠĠĠĠĠĠĠ Ġis ĠSingle < *, Ġ*> Ġ-> Ġleft . and Then F ( right ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġfun Ġ< A , ĠB , ĠC > ĠAnd Then < A , ĠB >. flatMap ( f : Ġ( B ) Ġ-> ĠAnd Then < A , ĠC >): ĠAnd Then < A , ĠC > Ġ= ĊĠĠĠ ĠAnd Then . Join ( this . and Then ( f )) Ċ