/* Ċ Ġ* Ġ@ (# ) ĠCo P ipelines . kt Ċ Ġ* Ċ Ġ* Ġco - pipelines ĠĠ ĠPipeline Ġlibrary Ġfor ĠKotlin Ġcor outines Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠPeter ĠWall Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġnet . p wall . util . pipeline Ċ Ċ /** Ċ Ġ* ĠA Ġpipeline Ġthat Ġaccepts Ġand Ġemits Ġvalues Ġof Ġthe Ġspecified Ġtypes . Ċ Ġ* Ċ Ġ* Ġ@ param ĠĠ ĠA ĠĠĠĠĠĠ Ġthe Ġaccepted Ġ( input ) Ġtype Ċ Ġ* Ġ@ param ĠĠ ĠE ĠĠĠĠĠĠ Ġthe Ġemitted Ġ( down stream ) Ġtype Ċ Ġ* Ġ@ param ĠĠ ĠR ĠĠĠĠĠĠ Ġthe Ġresult Ġtype Ċ Ġ*/ Ċ interface ĠCo Pipeline < in ĠA , Ġin ĠE , Ġout ĠR > Ġ: ĠCo Accept or < A , ĠR > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit Ġa Ġvalue , Ġthat Ġis , Ġforward Ġa Ġvalue Ġto Ġthe Ġdownstream Ġaccept or . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠĠ Ġvalue ĠĠ Ġthe Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġemit ( value : ĠE ) Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġpipeline Ġthat Ġtakes Ġinteger Ġvalues Ġand Ġemits Ġobject Ġvalues . Ċ Ġ* Ċ Ġ* Ġ@ param ĠĠ ĠE ĠĠĠĠĠĠ Ġthe Ġemitted Ġ( down stream ) Ġtype Ċ Ġ* Ġ@ param ĠĠ ĠR ĠĠĠĠĠĠ Ġthe Ġresult Ġtype Ċ Ġ*/ Ċ interface ĠInt Object Co Pipeline < in ĠE , Ġout ĠR > Ġ: ĠInt Co Accept or < R > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit Ġa Ġvalue , Ġthat Ġis , Ġforward Ġa Ġvalue Ġto Ġthe Ġdownstream Ġaccept or . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠĠ Ġvalue ĠĠ Ġthe Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġemit ( value : ĠE ) Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġpipeline Ġthat Ġaccepts Ġand Ġemits Ġinteger Ġvalues . Ċ Ġ* Ċ Ġ* Ġ@ param ĠĠ ĠR ĠĠĠĠĠĠ Ġthe Ġresult Ġtype Ċ Ġ*/ Ċ interface ĠInt Co Pipeline < out ĠR > Ġ: ĠInt Co Accept or < R > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit Ġa Ġvalue , Ġthat Ġis , Ġforward Ġa Ġvalue Ġto Ġthe Ġdownstream Ġaccept or . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠĠ Ġvalue ĠĠ Ġthe Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġemit ( value : ĠInt ) Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠAbstract Ġimplementation Ġof Ġ[ Co Pipeline ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠĠ ĠA ĠĠĠĠĠĠ Ġthe Ġaccepted Ġ( input ) Ġtype Ċ Ġ* Ġ@ param ĠĠ ĠE ĠĠĠĠĠĠ Ġthe Ġemitted Ġ( down stream ) Ġtype Ċ Ġ* Ġ@ param ĠĠ ĠR ĠĠĠĠĠĠ Ġthe Ġresult Ġtype Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract Co Pipeline < in ĠA , Ġin ĠE , Ġout ĠR >( private Ġval Ġdownstream : ĠCo Accept or < E , ĠR >) Ġ: ĊĠĠĠĠĠĠĠ ĠAbstract Co Accept or < A , ĠR >(), ĠCo Pipeline < A , ĠE , ĠR > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClose Ġthe Ġpipeline . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownstream . close () ĊĠĠĠĠĠĠĠ Ġsuper . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit Ġa Ġvalue Ġto Ġthe Ġdownstream Ġ[ Co Accept or ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠĠ Ġvalue ĠĠ Ġthe Ġvalue Ġto Ġbe Ġforwarded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġemit ( value : ĠE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdownstream . accept ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġresult Ġ( defaults Ġto Ġthe Ġresult Ġof Ġthe Ġdownstream Ġaccept or ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġresult : ĠR ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdownstream . result ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġ` true ` Ġif Ġall Ġsequences Ġin Ġthe Ġinput Ġare Ġcomplete , Ġthat Ġis , Ġthe Ġinput Ġis Ġnot Ġin Ġthe Ġmiddle Ġof Ġa ĊĠĠĠĠ Ġ* Ġsequence Ġrequiring Ġmore Ġdata . Ġ ĠThe Ġdefault Ġimplementation Ġtests Ġwhether Ġthe Ġdownstream Ġaccept or Ġis Ġcomplete . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġcomplete : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdownstream . complete ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro pag ate Ġthe Ġflush Ġoperation Ġto Ġthe Ġdownstream Ġaccept or . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownstream . flush () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠAbstract Ġimplementation Ġof Ġ[ Int Object Co Pipeline ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠĠ ĠE ĠĠĠĠĠĠ Ġthe Ġemitted Ġ( down stream ) Ġtype Ċ Ġ* Ġ@ param ĠĠ ĠR ĠĠĠĠĠĠ Ġthe Ġresult Ġtype Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract Int Object Co Pipeline < in ĠE , Ġout ĠR >( private Ġval Ġdownstream : ĠCo Accept or < E , ĠR >) Ġ: ĊĠĠĠĠĠĠĠ ĠAbstract Int Co Accept or < R >(), ĠInt Object Co Pipeline < E , ĠR > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClose Ġthe Ġpipeline . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownstream . close () ĊĠĠĠĠĠĠĠ Ġsuper . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit Ġa Ġvalue Ġto Ġthe Ġdownstream Ġ[ Co Accept or ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠĠ Ġvalue ĠĠ Ġthe Ġvalue Ġto Ġbe Ġforwarded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġemit ( value : ĠE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdownstream . accept ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġresult Ġ( defaults Ġto Ġthe Ġresult Ġof Ġthe Ġdownstream Ġaccept or ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġresult : ĠR ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdownstream . result ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġ` true ` Ġif Ġall Ġsequences Ġin Ġthe Ġinput Ġare Ġcomplete , Ġthat Ġis , Ġthe Ġinput Ġis Ġnot Ġin Ġthe Ġmiddle Ġof Ġa ĊĠĠĠĠ Ġ* Ġsequence Ġrequiring Ġmore Ġdata . Ġ ĠThe Ġdefault Ġimplementation Ġtests Ġwhether Ġthe Ġdownstream Ġaccept or Ġis Ġcomplete . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġcomplete : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdownstream . complete ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro pag ate Ġthe Ġflush Ġoperation Ġto Ġthe Ġdownstream Ġaccept or . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownstream . flush () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠAbstract Ġimplementation Ġof Ġ[ Int Co Pipeline ]. Ċ Ġ* Ċ Ġ* Ġ@ param ĠĠ ĠR ĠĠĠĠĠĠ Ġthe Ġresult Ġtype Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract Int Co Pipeline < out ĠR >( private Ġval Ġdownstream : ĠInt Co Accept or < R >) Ġ: ĠAbstract Int Co Accept or < R >(), ĊĠĠĠĠĠĠĠ ĠInt Co Pipeline < R > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClose Ġthe Ġpipeline . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownstream . close () ĊĠĠĠĠĠĠĠ Ġsuper . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit Ġa Ġvalue Ġto Ġthe Ġdownstream Ġ[ Int Co Accept or ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠĠ Ġvalue ĠĠ Ġthe Ġvalue Ġto Ġbe Ġforwarded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġemit ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdownstream . accept ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġresult Ġ( defaults Ġto Ġthe Ġresult Ġof Ġthe Ġdownstream Ġaccept or ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġresult : ĠR ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdownstream . result ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġ` true ` Ġif Ġall Ġsequences Ġin Ġthe Ġinput Ġare Ġcomplete , Ġthat Ġis , Ġthe Ġinput Ġis Ġnot Ġin Ġthe Ġmiddle Ġof Ġa ĊĠĠĠĠ Ġ* Ġsequence Ġrequiring Ġmore Ġdata . Ġ ĠThe Ġdefault Ġimplementation Ġtests Ġwhether Ġthe Ġdownstream Ġaccept or Ġis Ġcomplete . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġcomplete : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdownstream . complete ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro pag ate Ġthe Ġflush Ġoperation Ġto Ġthe Ġdownstream Ġaccept or . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠ Ġdownstream . flush () ĊĠĠĠ Ġ} Ċ Ċ } Ċ