package Ġio . in ap in ch . pipeline Ċ Ċ import Ġjava . util .* Ċ import Ġjava . util . stream . Collectors Ċ import Ġjava . util . stream . Stream Ċ Ċ interface ĠPipeline < T Ġ: ĠAny > Ġ{ ĊĊĠĠĠ Ġfun Ġ< R : ĠAny > Ġmap ( operation : Ġ( T ) Ġ-> ĠR ): ĠPipeline < R > ĊĊĠĠĠ Ġfun Ġ< R : ĠAny > Ġflat Map ( operation : Ġ( T ) Ġ-> ĠStream < R >) Ġ: ĠPipeline < R > ĊĊĠĠĠ Ġfun Ġfilter ( operation : Ġ( T ) Ġ-> ĠBoolean ): ĠPipeline < T > ĊĊĠĠĠ Ġfun Ġto List () Ġ: ĠCollection < T > ĊĊĠĠĠ Ġfun Ġskip ( skip Ġ: ĠInt Ġ= Ġ 1 ) Ġ: ĠPipeline < T > ĊĊĠĠĠ Ġfun Ġresult () Ġ: ĠOptional < T > ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T : ĠAny > Ġfrom ( items : ĠCollection < T >) Ġ: ĠPipeline < T > Ġ= ĠSingle Pipeline ( items . stream ()) ĊĠĠĠĠĠĠĠ Ġfun Ġ< T : ĠAny > Ġfrom ( var arg Ġitems : ĠT ) Ġ: ĠPipeline < T > Ġ= ĠSingle Pipeline ( Arrays . stream ( items )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠSingle Pipeline < T Ġ: ĠAny > Ġconstructor ( private Ġval Ġitems : ĠStream < T >) Ġ: ĠPipeline < T > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< R : ĠAny > Ġmap ( operation : Ġ( T ) Ġ-> ĠR ): ĠPipeline < R > Ġ= ĠSingle Pipeline ( items . map ( operation :: invoke )) ĊĊĠĠĠ Ġoverride Ġfun Ġ< R : ĠAny > Ġflat Map ( operation : Ġ( T ) Ġ-> ĠStream < R >): ĠPipeline < R > Ġ= ĠSingle Pipeline ( items . flatMap ( operation :: invoke )) ĊĊĠĠĠ Ġoverride Ġfun Ġfilter ( operation : Ġ( T ) Ġ-> ĠBoolean ): ĠPipeline < T > Ġ= ĠSingle Pipeline ( items . filter ( operation :: invoke )) ĊĊĠĠĠ Ġoverride Ġfun Ġto List () Ġ: ĠCollection < T > Ġ= Ġitems . collect ( Collectors . toList ()) ĊĊĠĠĠ Ġoverride Ġfun Ġskip ( skip Ġ: ĠInt ) Ġ: ĠPipeline < T > Ġ= ĠSingle Pipeline ( items . skip ( skip . to Long ())) ĊĊĠĠĠ Ġoverride Ġfun Ġresult () Ġ: ĠOptional < T > Ġ= Ġitems . reduce Ġ{ Ġfirst , Ġsecond Ġ-> ĠCombin ations Handler . combine ( first , Ġsecond ) Ġas ĠT Ġ} Ċ }