package Ġit . m sec . k io . integration Ċ Ċ import Ġassert k . assertThat Ċ import Ġassert k . assertions . isEqualTo Ċ import Ġit . m sec . k io . Task R Ċ import Ġit . m sec . k io . ask R Ċ import Ġit . m sec . k io . flatMap Ċ import Ġit . m sec . k io . result . get Ċ import Ġit . m sec . k io . runtime . unsafe Run Sync Ċ import Ġorg . junit . Test Ċ Ċ interface ĠDep 1 Ġ{ ĊĠĠĠ Ġfun Ġdo Dep 1 ( p : ĠString ): ĠInt Ġ= Ġp . length Ċ } Ċ Ċ interface ĠDep 2 Ġ{ ĊĠĠĠ Ġfun Ġdo Dep 2 ( p : ĠInt ): ĠString Ġ= Ġ" Hello Ġ$ p " Ċ } Ċ Ċ object ĠMy Env Ġ: ĠDep 1 , ĠDep 2 Ċ Ċ class ĠMod ular Environment Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` environment Ġcan Ġbe Ġcomposed Ġby Ġusing Ġmultiple Ġmodules Ġ( interfaces )` () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġuse Dep 1 < My Env >(" John ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġx Ġ-> Ġuse Dep 2 < My Env >( x ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unsafe Run Sync ( My Env ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( r ). isEqualTo (" Hello Ġ 4 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< R Ġ: ĠDep 1 > Ġuse Dep 1 ( name : ĠString ): ĠTask R < R , ĠInt > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġask R Ġ{ Ġenv Ġ-> Ġenv . do Dep 1 ( name ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< R Ġ: ĠDep 2 > Ġuse Dep 2 ( a : ĠInt ): ĠTask R < R , ĠString > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġask R Ġ{ Ġenv Ġ-> Ġenv . do Dep 2 ( a ) Ġ} Ċ Ċ } Ċ