@ file : Suppress (" UNUSED _ PARAMETER ", Ġ" Unused Main Parameter ", Ġ" unused ", Ġ" UNUSED _ VARIABLE ") Ċ Ċ package Ġorg . art rev . workshop . fp . part 1 . exercise 6 Ċ Ċ import Ġorg . art rev . workshop . fp . tools . and Then Ċ Ċ /* ĊĠ Ġ-- ĠOther Ġtypes Ġof ĠFunctions Ġ-- ĊĊĠ ĠIn Ġthe ĠJava Ġ 8 Ġstandard Ġlibrary Ġyou Ġcan Ġfind Ġfew Ġadditional Ġ" function - like " ĊĠ Ġtypes : ĊĠ Ġ- ĠSupplier < T > Ġwhich Ġis Ġjust Ġa ĠFunction < Void , ĠT > ĊĠ Ġ- ĠConsumer < T > Ġwhich Ġis Ġjust Ġa ĠFunction < T , ĠVoid > ĊĊĠ ĠWhy Ġthe Ġf uss ? ĠSimply Ġdue Ġto Ġthe Ġp ec ul iar Ġnature Ġof Ġthe ĠVoid Ġtype . ĠThis Ġtype ĊĠ Ġbefore ĠJava Ġ 5 Ġ( when Ġgener ics Ġwere Ġintroduced ) Ġwas Ġused Ġmainly Ġin Ġconjunction ĊĠ Ġwith Ġreflection . ĊĊĠ ĠIn ĠKotlin Ġthe Ġtype Ġsystem Ġis Ġmore Ġ" modern " Ġand Ġwe Ġcan Ġclean ly Ġexpress Ġthe ĊĠ Ġ" supplier " Ġand Ġ" consumer " Ġwith Ġusual ĠK Function 1 Ġand ĠUnit Ġtype Ġor Ġcan 't Ġwe ? Ċ */ Ċ Ċ object ĠIssues With The Unit Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsupply Int : Ġ( Unit ) Ġ-> ĠInt Ġ= Ġ{ Ġ 4 2 Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconsume Int : Ġ( Int ) Ġ-> ĠUnit Ġ= Ġ{ Ġprintln ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġblack Hole Ġ= Ġsupply Int . and Then ( consume Int ) ĊĊĠĠĠĠĠĠĠ Ġblack Hole ( Unit ) Ġ// a Ġwe e Ġbit Ġbetter Ġthen Ġpassing Ġa Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠ Ġ( Unit ) Ġ-> ĠUnit Ġis Ġnot Ġthe Ġsame Ġas Ġ() Ġ-> ĠUnit Ġsimply Ġbecause Ġthe Ġfirst ĊĠĠĠĠĠĠĠĠĠ Ġone Ġis Ġcompiled Ġto ĠFunction 1 Ġand Ġthe Ġsecond Ġone Ġto ĠFunction 0 , Ġbew are ! ĊĠĠĠĠĠĠĠĠĠ ĠCheck Ġthe Ġtools . jvm . functions Ġto Ġlook Ġat Ġthe Ġtypes ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġval Ġsupply Int 2 : Ġ() Ġ-> ĠInt Ġ= Ġ{ Ġ 4 2 Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġblack Hole 2 Ġ= Ġsupply Int 2 . and Then ( consume Int ) ĊĠĠĠĠĠĠĠ Ġblack Hole 2 () Ġ// Ġcalling Ġit Ġis Ġeasier Ġbut Ġit Ġis Ġnot Ġa Ġreal ĠA Ġ-> ĠB Ġfunction Ġ:( ĊĠĠĠ Ġ} Ċ } Ċ Ċ /* ĊĠ ĠAre Ġsuch Ġ" functions " Ġuseful ? ĠWe Ġtalk ed Ġabout Ġpure Ġand Ġimp ure Ġfunctions , Ġwe Ġalso ĊĠ Ġtalk ed Ġabout Ġrefer ential Ġtransparency . ĠSo Ġare Ġpure , Ġrefer ential Ġtransparent ĊĠ Ġfunctions Ġlike Ġthis Ġuseful ? ĊĊĠĠ 1 ) ĠA Ġpure Ġrefer ential Ġtransparent Ġfunction Ġfrom ĠUnit Ġto ĠT Ġwould Ġneed Ġto Ġreturn ĊĠ Ġthe Ġsame Ġresult Ġwhen Ġcalled Ġeach Ġtime Ġand Ġit Ġwould Ġnot Ġbe Ġvery Ġinteresting . ĊĊĠ ĠA ĠRandom . nextInt () Ġseems Ġlike Ġa Ġnice Ġcandidate , Ġbut Ġit Ġwould Ġhave Ġto Ġreturn Ġthe ĊĠ Ġsame Ġint Ġeach Ġtime . ĊĊĠĠ 2 ) ĠA Ġpure Ġrefer ential Ġtransparent Ġfunction Ġfrom ĠT Ġto ĠUnit Ġis Ġeven Ġless ĊĠ Ġinteresting Ġas Ġthis Ġfunction Ġwould Ġeat Ġup Ġany Ġinput Ġand Ġreturn Ġthe Ġsame Ġresult . ĊĊĠ ĠA Ġprint ( T ) Ġseems Ġlike Ġa Ġnice Ġcandidate , Ġbut Ġit Ġshould Ġjust Ġeat Ġup Ġthe Ġargument ĊĠ Ġand Ġdo Ġnothing . ĊĊĠ ĠThat 's Ġthe Ġtheory Ġbut Ġin Ġpractice Ġsupp liers Ġand Ġconsumers Ġare Ġused Ġto Ġmodel ĊĠ Ġsome Ġimp ure Ġeffects Ġlike Ġreading Ġfrom Ġa Ġnetwork Ġresource Ġor Ġwriting Ġto Ġa ĊĠ Ġdatabase . ĠSuch Ġmodeling Ġof Ġimp ure Ġeffects Ġcan Ġbe Ġdone Ġbetter Ġof c . Ċ Ġ*/ Ċ Ċ /* ĊĠ ĠPart Ġ 1 : ĊĊĠ ĠPlease Ġcreate Ġan Ġextension Ġfunction Ġcalled Ġ` compose ` Ġon Ġa Ġconsumer Ġ( B ) Ġ-> ĠUnit ĊĠ Ġthat Ġtakes Ġa Ġone Ġargument Ġfunction Ġ( A ) Ġ-> ĠB Ġand Ġreturns Ġa Ġconsumer Ġ( A ) Ġ-> ĠUnit Ċ Ġ*/ Ċ infix Ġfun Ġ< A , ĠB > Ġ(( B ) Ġ-> ĠUnit ). compose ( function : Ġ( A ) Ġ-> ĠB ): Ġ( A ) Ġ-> ĠUnit Ġ= ĊĠĠĠĠĠĠĠ ĠTODO (" Exercise Ġ 6 ĠConsumer . compose Ġis Ġmissing !") Ċ Ċ /* ĊĠ ĠPart Ġ 2 : ĊĊĠ ĠPlease Ġuse Ġthe Ġnewly Ġcreated Ġextension Ġfunction Ġ` compose ` Ġto Ġcompose ĊĠ Ġ- Ġa Ġconsumer Ġthat Ġprints ĠIn te gers ĊĠ Ġ- Ġa Ġfunction Ġthat Ġreturns Ġlength Ġof Ġa ĠString Ċ Ġ*/ Ċ internal Ġobject ĠComp osing Consumer Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprint Int : Ġ( Int ) Ġ-> ĠUnit Ġ= Ġ{ Ġprintln ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstrlen : Ġ( String ) Ġ-> ĠInt Ġ= Ġ{ Ġit . length Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprint Str Len : Ġ( String ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" Exercise Ġ 6 Ġprint Str Len Ġis Ġmissing !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprint Str Len (" https :// www . meet up . com / Java - User - Group - Lod z /") ĊĠĠĠ Ġ} Ċ } Ċ Ċ /* ĊĠ ĠPart Ġ 3 : ĊĊĠ ĠPlease Ġcreate Ġan Ġextension Ġfunction Ġcalled Ġ` and Then ` Ġon Ġa Ġsupplier Ġ() Ġ-> ĠA ĊĠ Ġthat Ġtakes Ġa Ġone Ġargument Ġfunction Ġ( A ) Ġ-> ĠB Ġand Ġreturns Ġa Ġsupplier Ġ() Ġ-> ĠB Ċ Ġ*/ Ċ infix Ġfun Ġ< A , ĠB > Ġ(() Ġ-> ĠA ). and Then ( function : Ġ( A ) Ġ-> ĠB ): Ġ() Ġ-> ĠB Ġ= ĊĠĠĠĠĠĠĠ ĠTODO (" Exercise Ġ 6 ĠSupplier . and Then Ġis Ġmissing !") Ċ Ċ /* ĊĠ ĠPart Ġ 4 : ĊĊĠ ĠPlease Ġuse Ġthe Ġnewly Ġcreated Ġextension Ġfunction Ġ` and Then ` Ġto Ġcompose ĊĠ Ġ- Ġa Ġsupplier Ġthat Ġreturns Ġa ĠString ĊĠ Ġ- Ġa Ġfunction Ġthat Ġreturns Ġlength Ġof Ġa ĠString Ċ Ġ*/ Ċ internal Ġobject ĠComp osing Supplier Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġget Facebook Ġ= Ġ{ Ġ" https :// www . facebook . com / groups / j ug lo dz /" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstrlen : Ġ( String ) Ġ-> ĠInt Ġ= Ġ{ Ġit . length Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġget F BL en : Ġ() Ġ-> ĠInt Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" Exercise Ġ 6 Ġget F BL en Ġis Ġmissing !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( getF BL en ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /* ĊĠ ĠPart Ġ 5 : ĊĊĠ ĠPlease Ġcreate Ġan Ġextension Ġfunction Ġcalled Ġ` apply First ` Ġto Ġsupply Ġthe Ġfirst ĊĠ Ġargument Ġof Ġa Ġcur ried Ġtwo Ġargument Ġfunction . Ċ Ġ*/ Ċ fun Ġ< A , ĠB , ĠC > Ġ(( A ) Ġ-> Ġ( B ) Ġ-> ĠC ). apply First ( supplier : Ġ() Ġ-> ĠA ): Ġ( B ) Ġ-> ĠC Ġ= ĊĠĠĠĠĠĠĠ ĠTODO (" Exercise Ġ 6 Ġapply First Ġis Ġmissing !") Ċ Ċ /* ĊĠ ĠPart Ġ 6 : ĊĊĠ ĠPlease Ġcreate Ġan Ġextension Ġfunction Ġcalled Ġ` apply First ` Ġto Ġsupply Ġthe Ġsecond ĊĠ Ġargument Ġof Ġa Ġcur ried Ġtwo Ġargument Ġfunction . Ċ Ġ*/ Ċ fun Ġ< A , ĠB , ĠC > Ġ(( A ) Ġ-> Ġ( B ) Ġ-> ĠC ). apply Second ( supplier : Ġ() Ġ-> ĠB ): Ġ( A ) Ġ-> ĠC Ġ= ĊĠĠĠĠĠĠĠ ĠTODO (" Exercise Ġ 6 Ġapply Second Ġis Ġmissing !")