diff --git "a/homework/7\354\236\245/\355\225\234\354\234\244\354\204\235.kt" "b/homework/7\354\236\245/\355\225\234\354\234\244\354\204\235.kt" new file mode 100644 index 0000000..b4e37ce --- /dev/null +++ "b/homework/7\354\236\245/\355\225\234\354\234\244\354\204\235.kt" @@ -0,0 +1,56 @@ +// ex1 +fun map2(a: Par, b: Par, block: (lx: T, rx: T) -> T): Par = + Par(block(a.get, b.get)) + +// ex2 +// ex3 +fun map2( + a: Par, + b: Par, + f: (A, B) -> C +): Par = { es: ExecutorService -> + val af: Future = a(es) + val bf: Future = b(es) + TimedMap2Future(af, bf, f) +} + +data class TimedMap2Future( + val pa: Future, + val pb: Future, + val f: (A, B) -> C +): Future { + override fun get(to: Long, tu: Timeunit): C { + val timeoutMills = TimeUnit.MILLISECONDS.convert(to, tu) + + val start = System.currentTimeMillis() + val a = pa.get(to, tu) + val duration = System.currentTimeMillis() - start + + val remainder = timeoutMills - duration + val b = pb.get(remainder, TimeUnit.MILLISECONDS) + return f(a, b) + } +} + +// ex4 +fun asyncF(f: (A) -> B): (A) -> Par = { a: A -> lazyUnit(f(a)) } + +// ex5 +fun sequence(ps: List>): Par> = when { + ps.isEmpty() -> unit(emptyList()) + ps.size == 1 -> map(ps.head()) { listOf(it) } + else -> { + val (l, r) = ps.splitAt(ps.size / 2) + map2(sequence(l), sequence(r)) { lx, rx -> lx + rx } + } +} + +// ex6 +fun parFilter(list: List, f: (A) -> Boolean): Par> { + val pars: List>> = list.map(lazyUnit { it }) + return map(sequence(pars)) { + it.flatMap { if (f(it)) listOf(it) else emptyList() } + } +} + +// ex7