fun merge()

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()
            }
        }
    }