in engine/src/main/kotlin/io/kotless/opt/LambdaMergeOptimizer.kt [24:49]
fun merge(lambdas: TypedStorage<Lambda>, level: Optimization.MergeLambda, context: OptimizationContext): Map<TypedStorage.Key<Lambda>, Lambda> {
return when (level) {
Optimization.MergeLambda.None -> lambdas.entries.map { it.key to it.value }.toMap()
Optimization.MergeLambda.All, Optimization.MergeLambda.PerPermissions -> {
val grouped = when (level) {
Optimization.MergeLambda.PerPermissions -> lambdas.entries.groupBy { (_, it) -> listOf(it.config, it.entrypoint, it.file, it.permissions) }
Optimization.MergeLambda.All -> lambdas.entries.groupBy { (_, it) -> listOf(it.config, it.entrypoint, it.file) }
Optimization.MergeLambda.None -> error("Merge mode could not be None, but was")
}
grouped.flatMap { (_, group) ->
if (group.size > 1) {
val (_, fst) = group.first()
val permissions = group.flatMap { it.value.permissions }.toSet()
val prefix = commonPrefix(group.map { it.value.name })
val mergedName = if (prefix.isEmpty()) "merged" else prefix
val merged = Lambda("${mergedName}-${context.getIndexAndIncrement()}", fst.file, fst.entrypoint, fst.config, permissions)
group.map { it.key to merged }
} else {
listOf(group.single().key to group.single().value)
}
}.toMap()
}
}
}