All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.freya02.botcommands.internal.core.ClassPathFunction.kt Maven / Gradle / Ivy

package com.freya02.botcommands.internal.core

import com.freya02.botcommands.internal.BContextImpl
import com.freya02.botcommands.internal.utils.FunctionFilter
import kotlin.reflect.KClass
import kotlin.reflect.KFunction

private typealias ClassPathFunctionIterable = Iterable

internal sealed class ClassPathFunction {
    abstract val instance: Any

    abstract val function: KFunction<*>

    operator fun component1() = instance
    operator fun component2() = function

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as ClassPathFunction

        return function == other.function
    }

    override fun hashCode(): Int {
        return function.hashCode()
    }
}

internal class LazyClassPathFunction internal constructor(
    private val context: BContextImpl,
    private val clazz: KClass<*>,
    override val function: KFunction<*>
) : ClassPathFunction() {
    override val instance by lazy { context.serviceContainer.getService(clazz) }
}

internal fun ClassPathFunction(context: BContextImpl, clazz: KClass<*>, function: KFunction<*>): ClassPathFunction {
    return LazyClassPathFunction(context, clazz, function)
}

internal class InstanceClassPathFunction internal constructor(
    override val instance: Any,
    override val function: KFunction<*>
) : ClassPathFunction()

internal fun Iterable>.toClassPathFunctions(instance: Any) = map { ClassPathFunction(instance, it) }

internal fun ClassPathFunction(instance: Any, function: KFunction<*>): ClassPathFunction {
    return InstanceClassPathFunction(instance, function)
}

internal fun  C.withFilter(filter: FunctionFilter) = this.filter { filter(it.function, false) }
internal fun  C.requiredFilter(filter: FunctionFilter) = this.onEach { filter(it.function, true) }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy