package Ġch . s bb . function alk otlin . effects Ċ Ċ sealed Ġclass ĠOption < out ĠA > Ġ{ ĊĊĠĠĠ Ġabstract Ġfun ĠisEmpty (): ĠBoolean ĊĊĠĠĠ Ġ// ĠExercise Ġ 3 . 1 : ĠImplement Ġa Ġget OrElse Ġfunction Ġthat Ġreturns Ġeither Ġthe Ġcontained Ġvalue , Ġif Ġit Ġexists , Ġor Ġa Ġprovided Ġdefault Ġone ĊĠĠĠ Ġfun Ġget OrElse ( default : Ġ@ Unsafe Variance ĠA ): ĠA Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSome < A > Ġ-> Ġvalue ĊĠĠĠĠĠĠĠ Ġis ĠNone Ġ-> Ġ Ġdefault ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠExercise Ġ 3 . 2 : ĠCreate Ġa Ġmap Ġfunction Ġto Ġchange Ġan ĠOption < A > Ġinto Ġan ĠOption < B > Ġby Ġapplying Ġa Ġfunction Ġfrom ĠA Ġto ĠB ĊĠĠĠ Ġ// ĠHint : Ġthe Ġfunction Ġcan Ġbe Ġeither Ġimplemented Ġin Ġthe Ġsubclasses Ġor Ġonce Ġfor Ġboth Ġsub types Ġin Ġthe Ġparent Ġclass ĊĠĠĠ Ġabstract Ġfun Ġ< B > Ġmap ( f : Ġ( A ) Ġ-> ĠB ): ĠOption < B > ĊĊĠĠĠ Ġ// ĠExercise Ġ 3 . 3 : ĠCreate Ġa Ġflat Map Ġinstance Ġfunction Ġtaking Ġas Ġan Ġargument Ġa Ġfunction Ġfrom ĠA Ġto ĠOption < B > Ġand Ġreturning Ġan ĠOption < B >. ĊĠĠĠ Ġ// ĠHint : ĠTry Ġdefining Ġthe Ġfunction Ġin Ġterms Ġof Ġmap Ġand Ġget OrElse ĊĠĠĠ Ġfun Ġ< B > Ġflat Map ( f : Ġ( A ) Ġ-> ĠOption < B >): ĠOption < B > Ġ= Ġmap ( f ). getOrElse ( None ) ĊĊĠĠĠ Ġ// ĠExercise Ġ 3 . 4 : ĠImplement Ġa Ġfilter Ġfunction Ġthat Ġkeeps Ġan Ġoption 's Ġvalue Ġonly Ġwhen Ġa Ġcondition Ġis Ġful filled ĊĠĠĠ Ġfun Ġfilter ( p : Ġ( A ) Ġ-> ĠBoolean ): ĠOption < A > Ġ= Ġ Ġflat Map Ġ{ Ġx Ġ-> Ġif Ġ( p ( x )) Ġthis Ġelse ĠNone Ġ} ĊĊĊĠĠĠ Ġinternal Ġobject ĠNone : ĠOption < Nothing >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠisEmpty () Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< B > Ġmap ( f : Ġ( Nothing ) Ġ-> ĠB ) Ġ= ĠNone ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" None " ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= Ġother Ġis ĠNone ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġdata Ġclass ĠSome < out ĠA >( internal Ġval Ġvalue : ĠA ) Ġ: ĠOption < A >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠisEmpty () Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< B > Ġmap ( f : Ġ( A ) Ġ-> ĠB ) Ġ= ĠOption ( f ( value )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġ< A > Ġinvoke ( a : ĠA ? Ġ= Ġnull ): ĠOption < A > Ġ= Ġwhen Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠNone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSome ( a ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }