├── core ├── .gitignore ├── src │ ├── main │ │ └── java │ │ │ └── life │ │ │ └── shank │ │ │ ├── Provider.kt │ │ │ ├── Shank.kt │ │ │ ├── ProviderExt.kt │ │ │ ├── NewProvider.kt │ │ │ ├── Scope.kt │ │ │ ├── SingletonProvider.kt │ │ │ ├── ScopedProvider.kt │ │ │ └── HashcodeHashMap.java │ └── test │ │ └── java │ │ └── life │ │ └── shank │ │ ├── DataForTest.kt │ │ ├── PerformanceTest.kt │ │ ├── testConcurrentAccess.kt │ │ ├── NewProviderTests.kt │ │ ├── TestFramework.kt │ │ ├── ShankTest.kt │ │ ├── SingletonProviderTests.kt │ │ ├── ScopedProviderTests.kt │ │ ├── Module1.kt │ │ └── Fib.kt └── build.gradle ├── android ├── .gitignore ├── consumer-rules.pro ├── jitpack.yml ├── src │ └── main │ │ ├── res │ │ └── values │ │ │ └── ids.xml │ │ ├── java │ │ └── life │ │ │ └── shank │ │ │ └── android │ │ │ ├── AppContextModule.kt │ │ │ ├── ShankContentProvider.kt │ │ │ ├── OnAttachListenerForScope.kt │ │ │ ├── LifecycleOwnerScopes.kt │ │ │ ├── AutoScopedFragmentLifecycleCallbacks.kt │ │ │ ├── AutoScopedActivityLifecycleCallbacks.kt │ │ │ ├── ParentScoped.kt │ │ │ └── AutoScoped.kt │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle ├── android-compose-navigation ├── .gitignore ├── consumer-rules.pro ├── jitpack.yml ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── life │ │ └── shank │ │ └── android │ │ └── ShankCompose.kt ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .idea ├── codeStyles │ ├── codeStyleConfig.xml │ └── Project.xml ├── vcs.xml ├── misc.xml ├── compiler.xml ├── gradle.xml └── jarRepositories.xml ├── .gitignore ├── gradle.properties ├── README.md ├── gradlew.bat ├── gradlew └── LICENSE.txt /core/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /android/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android-compose-navigation/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /android/jitpack.yml: -------------------------------------------------------------------------------- 1 | jdk: 2 | - openjdk11 -------------------------------------------------------------------------------- /android-compose-navigation/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android-compose-navigation/jitpack.yml: -------------------------------------------------------------------------------- 1 | jdk: 2 | - openjdk11 -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':core' 2 | include ':android' 3 | include ':android-compose-navigation' 4 | -------------------------------------------------------------------------------- /core/src/main/java/life/shank/Provider.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | 4 | interface Provider> 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memoizr/shank/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android-compose-navigation/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /core/src/test/java/life/shank/DataForTest.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | data class DataForTest( 4 | val a: Int? = null, 5 | val b: Int? = null, 6 | val c: Int? = null, 7 | val d: Int? = null, 8 | val e: Int? = null 9 | ) -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Aug 05 09:49:53 EEST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https://services.gradle.org/distributions/gradle-6.8-rc-1-bin.zip 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/src/main/java/life/shank/android/AppContextModule.kt: -------------------------------------------------------------------------------- 1 | package life.shank.android 2 | 3 | import android.content.Context 4 | import life.shank.ShankModule 5 | import life.shank.single 6 | 7 | object AppContextModule : ShankModule { 8 | internal lateinit var context: Context 9 | val appContext = single { -> context } 10 | } -------------------------------------------------------------------------------- /core/src/test/java/life/shank/PerformanceTest.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | import org.junit.Test 4 | 5 | class PerformanceTest { 6 | 7 | 8 | @Test 9 | fun arrayvspair() { 10 | } 11 | 12 | val hash = hashMapOf("yo" to 666) 13 | 14 | fun yo() { 15 | } 16 | 17 | fun yo2() { 18 | MyModule.newFoo() 19 | } 20 | } 21 | 22 | -------------------------------------------------------------------------------- /core/src/test/java/life/shank/testConcurrentAccess.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | import kotlinx.coroutines.CoroutineScope 4 | import kotlinx.coroutines.async 5 | import shouldBeEqualTo 6 | 7 | suspend inline fun CoroutineScope.testConcurrentAccess(crossinline x: () -> Long) { 8 | (1..8).map { async { x() } }.map { it.await() }.toSet().size shouldBeEqualTo 1 9 | } 10 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /core/src/main/java/life/shank/Shank.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | interface ShankModule 4 | 5 | object Shank { 6 | internal val scopedInstancesClearActions = HashSet<(Any?) -> Unit>() 7 | val internalSingletonInstanceCache by lazy { HashcodeHashMap() } 8 | val internalInstancesInScopesCache = HashcodeHashMap>() 9 | 10 | fun addScopedInstanceClearAction(action: (Any?) -> Unit) { 11 | scopedInstancesClearActions.add(action) 12 | } 13 | 14 | fun removeScopedInstanceClearAction(action: (Any?) -> Unit) { 15 | scopedInstancesClearActions.remove(action) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /core/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | id 'kotlin' 4 | id 'maven' 5 | } 6 | 7 | group = 'com.github.memoizr' 8 | 9 | java { 10 | sourceCompatibility = JavaVersion.VERSION_1_8 11 | targetCompatibility = JavaVersion.VERSION_1_8 12 | } 13 | 14 | dependencies { 15 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 16 | testImplementation 'junit:junit:4.13' 17 | testImplementation "org.jetbrains.kotlin:kotlin-reflect:1.4.10" 18 | testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9' 19 | } 20 | 21 | compileKotlin.kotlinOptions.freeCompilerArgs += ["-module-name", "shank.core"] -------------------------------------------------------------------------------- /android/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /android-compose-navigation/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ## For more details on how to configure your build environment visit 2 | # http://www.gradle.org/docs/current/userguide/build_environment.html 3 | # 4 | # Specifies the JVM arguments used for the daemon process. 5 | # The setting is particularly useful for tweaking memory settings. 6 | # Default value: -Xmx1024m -XX:MaxPermSize=256m 7 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 8 | # 9 | # When configured, Gradle will run in incubating parallel mode. 10 | # This option should only be used with decoupled projects. More details, visit 11 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 12 | # org.gradle.parallel=true 13 | #Thu May 14 11:03:39 EEST 2020 14 | android.enableJetifier=true 15 | android.useAndroidX=true 16 | kotlin.code.style=official 17 | org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M" 18 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 23 | 24 | -------------------------------------------------------------------------------- /android/src/main/java/life/shank/android/ShankContentProvider.kt: -------------------------------------------------------------------------------- 1 | package life.shank.android 2 | 3 | import android.app.Application 4 | import android.content.ContentProvider 5 | import android.content.ContentValues 6 | import android.database.Cursor 7 | import android.net.Uri 8 | 9 | class ShankContentProvider : ContentProvider() { 10 | override fun onCreate(): Boolean { 11 | (context!!.applicationContext as Application).registerActivityLifecycleCallbacks(AutoScopedActivityLifecycleCallbacks) 12 | AppContextModule.apply { context = this@ShankContentProvider.context!!.applicationContext } 13 | return true 14 | } 15 | 16 | override fun query(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String?): Cursor? = null 17 | override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?): Int = 0 18 | override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int = 0 19 | override fun insert(uri: Uri, values: ContentValues?): Uri? = null 20 | override fun getType(uri: Uri): String? = "" 21 | } -------------------------------------------------------------------------------- /android/src/main/java/life/shank/android/OnAttachListenerForScope.kt: -------------------------------------------------------------------------------- 1 | package life.shank.android 2 | 3 | import android.view.View 4 | import android.view.View.OnAttachStateChangeListener 5 | import life.shank.Scope 6 | import java.util.UUID 7 | 8 | internal class OnAttachListenerForScope(view: View) : OnAttachStateChangeListener { 9 | private val blocks = mutableSetOf<(Scope) -> Unit>() 10 | var scope: Scope? = null 11 | 12 | init { 13 | if (view.isAttachedToWindow) onViewAttachedToWindow(view) 14 | } 15 | 16 | fun onScopeReady(block: (Scope) -> Unit) { 17 | val scope = scope 18 | if (scope != null) { 19 | block(scope) 20 | } else { 21 | blocks.add(block) 22 | } 23 | } 24 | 25 | override fun onViewAttachedToWindow(view: View) { 26 | onViewDetachedFromWindow(view) 27 | val scope = Scope(UUID.randomUUID()) 28 | this.scope = scope 29 | blocks.forEach { it(scope) } 30 | blocks.clear() 31 | } 32 | 33 | override fun onViewDetachedFromWindow(view: View) { 34 | scope?.clear() 35 | scope = null 36 | } 37 | } -------------------------------------------------------------------------------- /android/src/main/java/life/shank/android/LifecycleOwnerScopes.kt: -------------------------------------------------------------------------------- 1 | package life.shank.android 2 | 3 | import androidx.lifecycle.LifecycleOwner 4 | import life.shank.Scope 5 | 6 | internal object LifecycleOwnerScopes { 7 | private val onScopeReadyActions = mutableListOf Unit>>() 8 | private val scopes = mutableMapOf() 9 | 10 | fun doOnScopeReady(lifecycleOwner: LifecycleOwner, onScopeReady: (Scope) -> Unit) { 11 | val scope = scopes[lifecycleOwner] 12 | if (scope != null) { 13 | onScopeReady(scope) 14 | } else { 15 | onScopeReadyActions.add(lifecycleOwner to onScopeReady) 16 | } 17 | } 18 | 19 | fun putScope(lifecycleOwner: LifecycleOwner, scope: Scope) { 20 | scopes[lifecycleOwner] = scope 21 | onScopeReadyActions.filter { it.first == lifecycleOwner }.forEach { it.second(scope) } 22 | onScopeReadyActions.removeAll { it.first == lifecycleOwner } 23 | } 24 | 25 | fun removeScope(lifecycleOwner: LifecycleOwner) { 26 | scopes.remove(lifecycleOwner) 27 | onScopeReadyActions.removeAll { it.first == lifecycleOwner } 28 | } 29 | 30 | fun getScope(lifecycleOwner: LifecycleOwner): Scope? = scopes[lifecycleOwner] 31 | } -------------------------------------------------------------------------------- /core/src/test/java/life/shank/NewProviderTests.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | import life.shank.ParameterNewModule.new0 4 | import life.shank.ParameterNewModule.new1 5 | import life.shank.ParameterNewModule.new2 6 | import life.shank.ParameterNewModule.new3 7 | import life.shank.ParameterNewModule.new4 8 | import life.shank.ParameterNewModule.new5 9 | import org.junit.Before 10 | import org.junit.Test 11 | import shouldBeEqualTo 12 | 13 | private object ParameterNewModule : ShankModule { 14 | val new0 = new { -> DataForTest() } 15 | val new1 = new { a: Int -> DataForTest(a) } 16 | val new2 = new { a: Int, b: Int -> DataForTest(a, b) } 17 | val new3 = new { a: Int, b: Int, c: Int -> DataForTest(a, b, c) } 18 | val new4 = new { a: Int, b: Int, c: Int, d: Int -> DataForTest(a, b, c, d) } 19 | val new5 = new { a: Int, b: Int, c: Int, d: Int, e: Int -> DataForTest(a, b, c, d, e) } 20 | } 21 | 22 | class NewTests { 23 | @Test 24 | fun `can register factories for new instance with up to 5 parameters`() { 25 | new0() shouldBeEqualTo DataForTest() 26 | new1(1) shouldBeEqualTo DataForTest(1) 27 | new2(1, 2) shouldBeEqualTo DataForTest(1, 2) 28 | new3(1, 2, 3) shouldBeEqualTo DataForTest(1, 2, 3) 29 | new4(1, 2, 3, 4) shouldBeEqualTo DataForTest(1, 2, 3, 4) 30 | new5(1, 2, 3, 4, 5) shouldBeEqualTo DataForTest(1, 2, 3, 4, 5) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://travis-ci.org/memoizr/shank.svg?branch=master)](https://travis-ci.org/memoizr/shank) 2 | [![codecov](https://codecov.io/gh/memoizr/shank/branch/master/graph/badge.svg)](https://codecov.io/gh/memoizr/shank) 3 | [![](https://jitpack.io/v/memoizr/shank.svg)](https://jitpack.io/#memoizr/shank) 4 | [![GitHub license](https://img.shields.io/github/license/kotlintest/kotlintest.svg)](http://www.apache.org/licenses/LICENSE-2.0.html) 5 | # Shank 6 | 7 | ### TLDR TUTORIAL: 8 | 9 | ### 1. Declare your modules by extending `ShankModule`, where you specify how the object should be created 10 | ```kotlin 11 | object MyModule: ShankModule() { 12 | val alwaysNew = new { -> Random() } 13 | val myClassDependency = singleton { -> MyClass() } 14 | val dependencyWithParam = singleton { p: String -> OtherClass(p) } 15 | } 16 | ``` 17 | 18 | ### 2. Then you register them at your earliest convenience 19 | ```kotlin 20 | registerModules(MyModule, SomeOtherModule, ...) 21 | ``` 22 | 23 | ### 3. Then you can inject your dependencies anywhere 24 | ```kotlin 25 | fun myCode() { 26 | ... 27 | blah.foo() 28 | ... 29 | 30 | myClassDependency().callSomeMethodOfMyClass() 31 | 32 | dependencyWithParam("foooo").callSomeMethodOfOtherClass() 33 | 34 | alwaysNew().nextInt() 35 | 36 | ... 37 | blah.blah() 38 | ... 39 | } 40 | ``` 41 | 42 | That's the end of the tutorial, you know how this library works. Now you can go have some actual coffee. 43 | 44 | -------------------------------------------------------------------------------- /android/src/main/java/life/shank/android/AutoScopedFragmentLifecycleCallbacks.kt: -------------------------------------------------------------------------------- 1 | package life.shank.android 2 | 3 | import android.os.Bundle 4 | import androidx.fragment.app.Fragment 5 | import androidx.fragment.app.FragmentManager 6 | import life.shank.Scope 7 | import java.util.UUID 8 | 9 | internal object AutoScopedFragmentLifecycleCallbacks : FragmentManager.FragmentLifecycleCallbacks() { 10 | private const val fragmentScopeKey = "shank_fragment_scope_key" 11 | 12 | override fun onFragmentPreCreated(fm: FragmentManager, fragment: Fragment, savedInstanceState: Bundle?) { 13 | if (fragment !is AutoScoped) return 14 | 15 | val scope = savedInstanceState?.getSerializable(fragmentScopeKey) as? Scope ?: Scope(UUID.randomUUID()) 16 | LifecycleOwnerScopes.putScope(fragment, scope) 17 | } 18 | 19 | override fun onFragmentDestroyed(fm: FragmentManager, fragment: Fragment) { 20 | if (fragment !is AutoScoped) return 21 | 22 | if (fragment.activity?.isFinishing == true || fragment.isRemoving) { 23 | LifecycleOwnerScopes.doOnScopeReady(fragment) { it.clear() } 24 | } 25 | LifecycleOwnerScopes.removeScope(fragment) 26 | } 27 | 28 | override fun onFragmentSaveInstanceState(fm: FragmentManager, f: Fragment, outState: Bundle) { 29 | if (f !is AutoScoped) return 30 | 31 | LifecycleOwnerScopes.doOnScopeReady(f) { 32 | outState.putSerializable(fragmentScopeKey, it) 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 39 | 40 | -------------------------------------------------------------------------------- /core/src/main/java/life/shank/ProviderExt.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("NOTHING_TO_INLINE") 2 | 3 | package life.shank 4 | 5 | import life.shank.Shank.internalInstancesInScopesCache 6 | import life.shank.Shank.internalSingletonInstanceCache 7 | 8 | inline fun > Provider.createOrGetScopedInstance(scope: Scope, instanceHashCode: Int, factory: () -> T): T { 9 | val cachedInstance = findCached(scope, instanceHashCode) 10 | if (cachedInstance != null) { 11 | return cachedInstance 12 | } 13 | 14 | val newInstance = factory() 15 | var scopeInstancesCache = internalInstancesInScopesCache[scope] 16 | if (scopeInstancesCache == null) { 17 | scopeInstancesCache = HashcodeHashMap() 18 | internalInstancesInScopesCache.put(scope, scopeInstancesCache) 19 | } 20 | scopeInstancesCache.put(instanceHashCode, newInstance) 21 | return newInstance 22 | } 23 | 24 | inline fun findCached(scope: Scope, instanceHashCode: Int): T? { 25 | val scopeInstances = internalInstancesInScopesCache[scope] ?: return null 26 | val scopeInstance = scopeInstances[instanceHashCode] 27 | @Suppress("UNCHECKED_CAST") 28 | return scopeInstance as? T? 29 | } 30 | 31 | inline fun > Provider.createOrGetSingletonInstance(instanceHashCode: Int, factory: () -> T): T { 32 | @Suppress("UNCHECKED_CAST") 33 | val cachedInstance = internalSingletonInstanceCache[instanceHashCode] as? T 34 | if (cachedInstance != null) { 35 | return cachedInstance 36 | } 37 | 38 | val newInstance = factory() 39 | internalSingletonInstanceCache.put(instanceHashCode, newInstance) 40 | return newInstance 41 | } 42 | 43 | inline fun shankInternalMashHashCodes(obj1: Any?, obj2: Any?, vararg otherObj: Any?): Int { 44 | var hashCode = obj1.hashCode() * 31 + obj2.hashCode() * 127 45 | otherObj.forEach { hashCode = hashCode * 31 + it.hashCode() * 127 } 46 | return hashCode 47 | } 48 | -------------------------------------------------------------------------------- /android/src/main/java/life/shank/android/AutoScopedActivityLifecycleCallbacks.kt: -------------------------------------------------------------------------------- 1 | package life.shank.android 2 | 3 | import android.app.Activity 4 | import android.app.Application 5 | import android.os.Bundle 6 | import androidx.fragment.app.FragmentActivity 7 | import androidx.lifecycle.LifecycleOwner 8 | import life.shank.Scope 9 | import java.util.UUID 10 | 11 | internal object AutoScopedActivityLifecycleCallbacks : Application.ActivityLifecycleCallbacks { 12 | private const val activityScopeKey = "shank_activity_scope_key" 13 | 14 | override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { 15 | if (activity is AutoScoped && activity is LifecycleOwner) { 16 | val scope = savedInstanceState?.getSerializable(activityScopeKey) as? Scope ?: Scope(UUID.randomUUID()) 17 | LifecycleOwnerScopes.putScope(activity, scope) 18 | } 19 | 20 | (activity as? FragmentActivity) 21 | ?.supportFragmentManager 22 | ?.registerFragmentLifecycleCallbacks(AutoScopedFragmentLifecycleCallbacks, true) 23 | } 24 | 25 | override fun onActivityDestroyed(activity: Activity) { 26 | if (activity !is AutoScoped || activity !is LifecycleOwner) return 27 | 28 | if (activity.isFinishing) { 29 | LifecycleOwnerScopes.doOnScopeReady(activity) { it.clear() } 30 | } 31 | LifecycleOwnerScopes.removeScope(activity) 32 | } 33 | 34 | override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { 35 | if (activity !is AutoScoped || activity !is LifecycleOwner) return 36 | 37 | LifecycleOwnerScopes.doOnScopeReady(activity) { 38 | outState.putSerializable(activityScopeKey, it) 39 | } 40 | } 41 | 42 | override fun onActivityPaused(activity: Activity) = Unit 43 | override fun onActivityResumed(activity: Activity) = Unit 44 | override fun onActivityStarted(activity: Activity) = Unit 45 | override fun onActivityStopped(activity: Activity) = Unit 46 | } -------------------------------------------------------------------------------- /core/src/main/java/life/shank/NewProvider.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | interface NewProvider0 : Provider T> { 4 | operator fun invoke(): T 5 | } 6 | 7 | interface NewProvider1 : Provider T> { 8 | operator fun invoke(p1: P1): T 9 | } 10 | 11 | interface NewProvider2 : Provider T> { 12 | operator fun invoke(p1: P1, p2: P2): T 13 | } 14 | 15 | interface NewProvider3 : Provider T> { 16 | operator fun invoke(p1: P1, p2: P2, p3: P3): T 17 | } 18 | 19 | interface NewProvider4 : Provider T> { 20 | operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4): T 21 | } 22 | 23 | interface NewProvider5 : Provider T> { 24 | operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5): T 25 | } 26 | 27 | inline fun ShankModule.new(crossinline factory: () -> T) = object : NewProvider0 { 28 | override fun invoke(): T = factory() 29 | } 30 | 31 | inline fun ShankModule.new(crossinline factory: (P1) -> T) = object : NewProvider1 { 32 | override fun invoke(p1: P1): T = factory(p1) 33 | } 34 | 35 | inline fun ShankModule.new(crossinline factory: (P1, P2) -> T) = object : NewProvider2 { 36 | override fun invoke(p1: P1, p2: P2): T = factory(p1, p2) 37 | } 38 | 39 | inline fun ShankModule.new(crossinline factory: (P1, P2, P3) -> T) = object : NewProvider3 { 40 | override fun invoke(p1: P1, p2: P2, p3: P3): T = factory(p1, p2, p3) 41 | } 42 | 43 | inline fun ShankModule.new(crossinline factory: (P1, P2, P3, P4) -> T) = object : NewProvider4 { 44 | override fun invoke(p1: P1, p2: P2, p3: P3, p4: P4): T = factory(p1, p2, p3, p4) 45 | } 46 | 47 | inline fun ShankModule.new(crossinline factory: (P1, P2, P3, P4, P5) -> T) = object : NewProvider5 { 48 | override fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5): T = factory(p1, p2, p3, p4, p5) 49 | } 50 | -------------------------------------------------------------------------------- /core/src/test/java/life/shank/TestFramework.kt: -------------------------------------------------------------------------------- 1 | import kotlinx.coroutines.CompletableDeferred 2 | import kotlinx.coroutines.CoroutineScope 3 | import kotlinx.coroutines.async 4 | import kotlinx.coroutines.coroutineScope 5 | import kotlin.reflect.KClass 6 | 7 | infix fun T?.shouldBeInstanceOf(other: KClass) = asserts(other.isInstance(this)) { 8 | """Expected: 9 | ${this!!::class} 10 | To be instance of: 11 | $other""" 12 | } 13 | 14 | infix fun T?.shouldNotBeSameReference(other: T) = asserts(this !== other) { 15 | """Values should not be same reference but are;""" 16 | } 17 | 18 | infix fun T?.shouldBeSameReference(other: T) = asserts(this === other) { 19 | """Values should be same reference but aren't; 20 | Expected: 21 | $other 22 | Actual: 23 | $this""" 24 | } 25 | 26 | infix fun T?.shouldBeSameReferenceAsAnyOf(other: List) = asserts(other.any { it === this }) { 27 | """Value should be same reference but aren't; 28 | Expected one of: 29 | $other 30 | Actual: 31 | $this""" 32 | } 33 | 34 | infix fun T?.shouldBeEqualTo(other: T) = asserts(this == other) { 35 | """Values should be equal but aren't; 36 | Expected: 37 | $other 38 | Actual: 39 | $this""" 40 | } 41 | 42 | infix fun T?.shouldNotBeEqualTo(other: T) = asserts(this != other) { 43 | """Values should not be equal but are; 44 | Value: 45 | $this""" 46 | } 47 | 48 | public inline fun asserts(value: Boolean, lazyMessage: () -> Any) { 49 | if (!value) { 50 | val message = lazyMessage() 51 | throw AssertionError(message) 52 | } 53 | } 54 | 55 | suspend fun testConcurrentSingletonGet(getInstance: () -> Any) = coroutineScope { 56 | val goGetInstanceTrigger = CompletableDeferred() 57 | val instance1Async = async { 58 | goGetInstanceTrigger.await() 59 | getInstance() 60 | } 61 | val instance2Async = async { 62 | goGetInstanceTrigger.await() 63 | getInstance() 64 | } 65 | goGetInstanceTrigger.complete(Unit) 66 | instance1Async.await() shouldBeSameReference instance2Async.await() 67 | } -------------------------------------------------------------------------------- /core/src/main/java/life/shank/Scope.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | import life.shank.Shank.internalInstancesInScopesCache 4 | import life.shank.Shank.scopedInstancesClearActions 5 | import java.io.Serializable 6 | 7 | data class Scope(val value: Serializable) : Serializable { 8 | @Transient 9 | private var clearActions: HashSet<(Any?) -> Unit>? = null 10 | @Transient 11 | @JvmField 12 | val hashcode = value.hashCode() 13 | 14 | fun clear() { 15 | internalInstancesInScopesCache.get(hashcode)?.values?.filterNotNull()?.forEach { item -> 16 | clearActions?.forEach { action -> action(item) } 17 | scopedInstancesClearActions.forEach { action -> action(item) } 18 | } 19 | internalInstancesInScopesCache.remove(hashcode) 20 | } 21 | 22 | fun addOnClearAction(action: (Any?) -> Unit): Scope { 23 | var clearActions = this.clearActions 24 | if (clearActions == null) { 25 | clearActions = HashSet() 26 | this.clearActions = clearActions 27 | } 28 | clearActions.add(action) 29 | return this 30 | } 31 | 32 | fun removeOnClearAction(action: (Any?) -> Unit) = apply { 33 | clearActions?.remove(action) 34 | } 35 | 36 | override fun hashCode(): Int = hashcode 37 | override fun equals(other: Any?): Boolean = this.hashcode == other.hashCode() 38 | } 39 | 40 | interface Scoped { 41 | val scope: Scope 42 | 43 | operator fun ScopedProvider0.invoke() = this(scope) 44 | operator fun ScopedProvider1.invoke(p1: P1) = this(scope, p1) 45 | operator fun ScopedProvider2.invoke(p1: P1, p2: P2) = this(scope, p1, p2) 46 | operator fun ScopedProvider3.invoke(p1: P1, p2: P2, p3: P3) = this(scope, p1, p2, p3) 47 | operator fun ScopedProvider4.invoke(p1: P1, p2: P2, p3: P3, p4: P4) = this(scope, p1, p2, p3, p4) 48 | operator fun ScopedProvider5.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) = this(scope, p1, p2, p3, p4, p5) 49 | } 50 | 51 | data class InternalScoped(override val scope: Scope) : Scoped 52 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | id 'kotlin-android' 4 | id 'maven-publish' 5 | } 6 | 7 | group = 'com.github.memoizr' 8 | 9 | android { 10 | compileSdkVersion 30 11 | 12 | defaultConfig { 13 | minSdkVersion 21 14 | targetSdkVersion 30 15 | versionCode 1 16 | versionName "1.0" 17 | 18 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 19 | consumerProguardFiles "consumer-rules.pro" 20 | } 21 | 22 | buildTypes { 23 | release { 24 | minifyEnabled false 25 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 26 | } 27 | } 28 | compileOptions { 29 | sourceCompatibility JavaVersion.VERSION_1_8 30 | targetCompatibility JavaVersion.VERSION_1_8 31 | } 32 | kotlinOptions { 33 | jvmTarget = '1.8' 34 | freeCompilerArgs += ["-module-name", "shank.android"] 35 | } 36 | } 37 | 38 | dependencies { 39 | api project(path: ':core') 40 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 41 | implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0" 42 | implementation 'androidx.appcompat:appcompat:1.3.0-alpha02' 43 | implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01' 44 | implementation "androidx.core:core-ktx:1.3.2" 45 | } 46 | 47 | afterEvaluate { 48 | publishing { 49 | publications { 50 | // Creates a Maven publication called "release". 51 | release(MavenPublication) { 52 | // Applies the component for the release build variant. 53 | from components.release 54 | 55 | // You can then customize attributes of the publication as shown below. 56 | groupId = 'life.shank' 57 | artifactId = 'final' 58 | version = '1.0' 59 | } 60 | // Creates a Maven publication called “debug”. 61 | debug(MavenPublication) { 62 | // Applies the component for the debug build variant. 63 | from components.debug 64 | 65 | groupId = 'life.shank' 66 | artifactId = 'final-debug' 67 | version = '1.0' 68 | } 69 | } 70 | } 71 | } -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /core/src/test/java/life/shank/ShankTest.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | import life.shank.MyModule.listOfInts 4 | import life.shank.MyModule.listOfStrings 5 | import life.shank.MyModule.newFoo 6 | import life.shank.MyModule.otherScopeSingleton 7 | import life.shank.MyModule.scopedSingleton 8 | import org.junit.Before 9 | import org.junit.Test 10 | import shouldBeEqualTo 11 | import shouldBeInstanceOf 12 | import shouldNotBeEqualTo 13 | import java.util.* 14 | 15 | object MyModule : ShankModule { 16 | val newFoo = new { -> MyClass("my value") } 17 | val listOfStrings = new { -> ArrayList().also { it.add("one") } } 18 | val listOfInts = new { -> ArrayList().also { it.add(1) } } 19 | 20 | val scopedSingleton = scoped { -> OtherClass() } 21 | val otherScopeSingleton = scoped { -> MyClass("value") } 22 | // val singleton = singleton { -> OtherClass() } 23 | 24 | val nullable = new { -> if ("" == "") MyClass("") else null } 25 | val nullable1 = new { s: String?, b: String -> if (s == "") MyClass("") else null } 26 | } 27 | 28 | class ShankTest : Scoped { 29 | override val scope = Scope("myscope") 30 | 31 | @Test 32 | fun `provides new value`() { 33 | newFoo().value shouldBeEqualTo "my value" 34 | newFoo() shouldNotBeEqualTo newFoo() 35 | } 36 | 37 | @Test 38 | fun `supports generics`() { 39 | listOfStrings()[0] shouldBeEqualTo "one" 40 | listOfInts()[0] shouldBeEqualTo 1 41 | } 42 | 43 | @Test 44 | fun `caches values for a specific scope`() { 45 | val scope = Scope("scope") 46 | scopedSingleton(scope) shouldBeEqualTo scopedSingleton(scope) 47 | otherScopeSingleton(scope) shouldBeInstanceOf MyClass::class 48 | } 49 | 50 | @Test 51 | fun `clears a specific scope`() { 52 | val scope = Scope("scope") 53 | val instance1 = scopedSingleton(scope) 54 | val instance2 = scopedSingleton(scope) 55 | instance1 shouldBeEqualTo instance2 56 | scope.clear() 57 | val instance3 = scopedSingleton(scope) 58 | instance1 shouldNotBeEqualTo instance3 59 | instance2 shouldNotBeEqualTo instance3 60 | 61 | val instance4 = scopedSingleton(scope) 62 | instance3 shouldBeEqualTo instance4 63 | } 64 | 65 | @Test 66 | fun `supports global scope`() { 67 | // singleton() shouldBeEqualTo singleton() 68 | } 69 | 70 | @Test 71 | fun `automatically injects scope for scoped class`() { 72 | scopedSingleton() shouldBeEqualTo scopedSingleton() 73 | } 74 | } 75 | 76 | class OtherClass 77 | class MyClass(val value: String) 78 | 79 | -------------------------------------------------------------------------------- /core/src/main/java/life/shank/SingletonProvider.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | interface SingleProvider0 : Provider T> { 4 | operator fun invoke(): T 5 | } 6 | 7 | interface SingleProvider1 : Provider T> { 8 | operator fun invoke(p1: P1): T 9 | } 10 | 11 | interface SingleProvider2 : Provider T> { 12 | operator fun invoke(p1: P1, p2: P2): T 13 | } 14 | 15 | interface SingleProvider3 : Provider T> { 16 | operator fun invoke(p1: P1, p2: P2, p3: P3): T 17 | } 18 | 19 | interface SingleProvider4 : Provider T> { 20 | operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4): T 21 | } 22 | 23 | interface SingleProvider5 : Provider T> { 24 | operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5): T 25 | } 26 | 27 | inline fun ShankModule.single(crossinline factory: () -> T) = object : SingleProvider0 { 28 | @Synchronized 29 | override fun invoke(): T = createOrGetSingletonInstance(hashCode()) { factory() } 30 | } 31 | 32 | inline fun ShankModule.single(crossinline factory: (P1) -> T) = object : SingleProvider1 { 33 | @Synchronized 34 | override fun invoke(p1: P1): T = createOrGetSingletonInstance(shankInternalMashHashCodes(this, p1)) { factory(p1) } 35 | } 36 | 37 | inline fun ShankModule.single(crossinline factory: (P1, P2) -> T) = object : SingleProvider2 { 38 | @Synchronized 39 | override fun invoke(p1: P1, p2: P2): T = createOrGetSingletonInstance(shankInternalMashHashCodes(this, p1, p2)) { factory(p1, p2) } 40 | } 41 | 42 | inline fun ShankModule.single(crossinline factory: (P1, P2, P3) -> T) = object : SingleProvider3 { 43 | @Synchronized 44 | override fun invoke(p1: P1, p2: P2, p3: P3): T = createOrGetSingletonInstance(shankInternalMashHashCodes(this, p1, p2, p3)) { factory(p1, p2, p3) } 45 | } 46 | 47 | inline fun ShankModule.single(crossinline factory: (P1, P2, P3, P4) -> T) = object : SingleProvider4 { 48 | @Synchronized 49 | override fun invoke(p1: P1, p2: P2, p3: P3, p4: P4): T = 50 | createOrGetSingletonInstance(shankInternalMashHashCodes(this, p1, p2, p3, p4)) { factory(p1, p2, p3, p4) } 51 | } 52 | 53 | inline fun ShankModule.single(crossinline factory: (P1, P2, P3, P4, P5) -> T) = object : SingleProvider5 { 54 | @Synchronized 55 | override fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5): T = 56 | createOrGetSingletonInstance(shankInternalMashHashCodes(this, p1, p2, p3, p4, p5)) { factory(p1, p2, p3, p4, p5) } 57 | } 58 | -------------------------------------------------------------------------------- /android-compose-navigation/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | id 'kotlin-android' 4 | id 'maven-publish' 5 | } 6 | 7 | group = 'com.github.memoizr' 8 | 9 | android { 10 | compileSdkVersion 30 11 | 12 | defaultConfig { 13 | minSdkVersion 21 14 | targetSdkVersion 30 15 | versionCode 1 16 | versionName "1.0" 17 | 18 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 19 | consumerProguardFiles "consumer-rules.pro" 20 | } 21 | 22 | buildTypes { 23 | release { 24 | minifyEnabled false 25 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 26 | } 27 | } 28 | compileOptions { 29 | sourceCompatibility JavaVersion.VERSION_1_8 30 | targetCompatibility JavaVersion.VERSION_1_8 31 | } 32 | kotlinOptions { 33 | jvmTarget = '1.8' 34 | freeCompilerArgs += ["-module-name", "shank.android-compose-navigation"] 35 | } 36 | buildFeatures { 37 | compose true 38 | } 39 | composeOptions { 40 | kotlinCompilerExtensionVersion "$compose_version" 41 | kotlinCompilerVersion "1.4.10" 42 | } 43 | } 44 | 45 | dependencies { 46 | api project(path: ':core') 47 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 48 | implementation "androidx.compose.runtime:runtime:$compose_version" 49 | implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.0-beta01" 50 | implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01' 51 | implementation 'com.github.mvarnagiris.compose-navigation:navigation:0.5.0' 52 | } 53 | 54 | tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { 55 | kotlinOptions { 56 | jvmTarget = "1.8" 57 | freeCompilerArgs += ["-Xallow-jvm-ir-dependencies", "-Xskip-prerelease-check"] 58 | } 59 | } 60 | afterEvaluate { 61 | publishing { 62 | publications { 63 | // Creates a Maven publication called "release". 64 | release(MavenPublication) { 65 | // Applies the component for the release build variant. 66 | from components.release 67 | 68 | // You can then customize attributes of the publication as shown below. 69 | groupId = 'life.shank' 70 | artifactId = 'final' 71 | version = '1.0' 72 | } 73 | // Creates a Maven publication called “debug”. 74 | debug(MavenPublication) { 75 | // Applies the component for the debug build variant. 76 | from components.debug 77 | 78 | groupId = 'life.shank' 79 | artifactId = 'final-debug' 80 | version = '1.0' 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /android-compose-navigation/src/main/java/life/shank/android/ShankCompose.kt: -------------------------------------------------------------------------------- 1 | package life.shank.android 2 | 3 | import androidx.compose.runtime.Composable 4 | import androidx.compose.runtime.Providers 5 | import androidx.compose.runtime.ambientOf 6 | import androidx.compose.runtime.onDispose 7 | import androidx.compose.runtime.remember 8 | import com.koduok.compose.navigation.BackStackAmbient 9 | import com.koduok.compose.navigation.core.BackStack.Listener 10 | import com.koduok.compose.navigation.core.Route 11 | import life.shank.Scope 12 | import life.shank.Scoped 13 | import java.util.UUID 14 | 15 | val ScopeAmb = ambientOf { throw IllegalStateException("Scope not defined") } 16 | private val scopesCache = mutableMapOf() 17 | 18 | private data class ScopeKey(val route: Route<*>) 19 | private class InternalScoped(override val scope: Scope) : Scoped 20 | 21 | @Composable 22 | fun RouteScope(createScope: () -> Scope = { Scope(UUID.randomUUID()) }, children: @Composable() Scoped.() -> Unit) { 23 | val backStack = BackStackAmbient.current 24 | var currentRoute = remember { backStack.current } 25 | 26 | val scope: Scope = remember { 27 | val scopeKey = ScopeKey(currentRoute) 28 | val existingScope = scopesCache[scopeKey] 29 | if (existingScope != null) return@remember existingScope 30 | 31 | val scope = createScope() 32 | scopesCache[scopeKey] = scope 33 | 34 | backStack.addListener(object : Listener { 35 | override fun onRemoved(route: Route) { 36 | if (route == currentRoute) { 37 | scopesCache.remove(ScopeKey(route))?.clear() 38 | backStack.removeListener(this) 39 | } 40 | } 41 | 42 | override fun onIndexChanged(route: Route, previousIndex: Int) { 43 | val previousRoute = route.copy(index = previousIndex) 44 | if (previousRoute == currentRoute) { 45 | currentRoute = route 46 | val cachedScope = scopesCache.remove(ScopeKey(previousRoute)) 47 | if (cachedScope != null) { 48 | scopesCache[ScopeKey(route)] = cachedScope 49 | } 50 | } 51 | } 52 | }) 53 | 54 | scope 55 | } 56 | 57 | Providers(ScopeAmb.provides(scope)) { 58 | children(InternalScoped(scope)) 59 | } 60 | } 61 | 62 | @Composable 63 | fun Scope(createScope: () -> Scope = { Scope(UUID.randomUUID()) }, children: @Composable() Scoped.() -> Unit) { 64 | val scope = remember { createScope() } 65 | onDispose { 66 | scope.clear() 67 | } 68 | 69 | Providers(ScopeAmb.provides(scope)) { 70 | children(InternalScoped(scope)) 71 | } 72 | } 73 | 74 | @Composable 75 | fun ParentScope(children: @Composable Scoped.() -> Unit) { 76 | val scope = ScopeAmb.current 77 | val scoped = remember { InternalScoped(scope) } 78 | children(scoped) 79 | } 80 | -------------------------------------------------------------------------------- /core/src/test/java/life/shank/SingletonProviderTests.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | import kotlinx.coroutines.Dispatchers 4 | import kotlinx.coroutines.runBlocking 5 | import life.shank.ParameterSingletonModule.single0 6 | import life.shank.ParameterSingletonModule.single1 7 | import life.shank.ParameterSingletonModule.single2 8 | import life.shank.ParameterSingletonModule.single3 9 | import life.shank.ParameterSingletonModule.single4 10 | import life.shank.ParameterSingletonModule.single5 11 | import org.junit.Test 12 | import shouldBeEqualTo 13 | import shouldBeSameReference 14 | import shouldNotBeSameReference 15 | import testConcurrentSingletonGet 16 | 17 | private object ParameterSingletonModule : ShankModule { 18 | val single0 = single { -> DataForTest() } 19 | val single1 = single { a: Int -> DataForTest(a) } 20 | val single2 = single { a: Int, b: Int -> DataForTest(a, b) } 21 | val single3 = single { a: Int, b: Int, c: Int -> DataForTest(a, b, c) } 22 | val single4 = single { a: Int, b: Int, c: Int, d: Int -> DataForTest(a, b, c, d) } 23 | val single5 = single { a: Int, b: Int, c: Int, d: Int, e: Int -> DataForTest(a, b, c, d, e) } 24 | } 25 | 26 | class SingletonTests { 27 | 28 | @Test 29 | fun `can register factories for singleton instance with up to 5 parameters`() { 30 | single0() shouldBeEqualTo DataForTest() 31 | single0() shouldBeSameReference single0() 32 | 33 | single1(1) shouldBeEqualTo DataForTest(1) 34 | single1(1) shouldBeSameReference single1(1) 35 | 36 | single2(1, 2) shouldBeEqualTo DataForTest(1, 2) 37 | single2(1, 2) shouldBeSameReference single2(1, 2) 38 | 39 | single3(1, 2, 3) shouldBeEqualTo DataForTest(1, 2, 3) 40 | single3(1, 2, 3) shouldBeSameReference single3(1, 2, 3) 41 | 42 | single4(1, 2, 3, 4) shouldBeEqualTo DataForTest(1, 2, 3, 4) 43 | single4(1, 2, 3, 4) shouldBeSameReference single4(1, 2, 3, 4) 44 | 45 | single5(1, 2, 3, 4, 5) shouldBeEqualTo DataForTest(1, 2, 3, 4, 5) 46 | single5(1, 2, 3, 4, 5) shouldBeSameReference single5(1, 2, 3, 4, 5) 47 | } 48 | 49 | @Test 50 | fun `different parameters will create new singleton for those parameters`() { 51 | single1(1) shouldNotBeSameReference single1(2) 52 | single2(1, 2) shouldNotBeSameReference single2(2, 4) 53 | single3(1, 2, 3) shouldNotBeSameReference single3(2, 4, 6) 54 | single4(1, 2, 3, 4) shouldNotBeSameReference single4(2, 4, 6, 8) 55 | single5(1, 2, 3, 4, 5) shouldNotBeSameReference single5(2, 4, 6, 8, 10) 56 | } 57 | 58 | @Test 59 | fun `supports concurrent and suspend requests`() = runBlocking(Dispatchers.Default) { 60 | testConcurrentSingletonGet { single0() } 61 | testConcurrentSingletonGet { single1(1) } 62 | testConcurrentSingletonGet { single2(1, 2) } 63 | testConcurrentSingletonGet { single3(1, 2, 3) } 64 | testConcurrentSingletonGet { single4(1, 2, 3, 4) } 65 | testConcurrentSingletonGet { single5(1, 2, 3, 4, 5) } 66 | } 67 | } 68 | 69 | -------------------------------------------------------------------------------- /core/src/main/java/life/shank/ScopedProvider.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | 4 | interface ScopedProvider0 : Provider T> { 5 | operator fun invoke(scope: Scope): T 6 | } 7 | 8 | interface ScopedProvider1 : Provider T> { 9 | operator fun invoke(scope: Scope, p1: P1): T 10 | } 11 | 12 | interface ScopedProvider2 : Provider T> { 13 | operator fun invoke(scope: Scope, p1: P1, p2: P2): T 14 | } 15 | 16 | interface ScopedProvider3 : Provider T> { 17 | operator fun invoke(scope: Scope, p1: P1, p2: P2, p3: P3): T 18 | } 19 | 20 | interface ScopedProvider4 : Provider T> { 21 | operator fun invoke(scope: Scope, p1: P1, p2: P2, p3: P3, p4: P4): T 22 | } 23 | 24 | interface ScopedProvider5 : Provider T> { 25 | operator fun invoke(scope: Scope, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5): T 26 | } 27 | 28 | inline fun ShankModule.scoped(crossinline factory: Scoped.() -> T): ScopedProvider0 = object : ScopedProvider0 { 29 | @Synchronized 30 | override fun invoke(scope: Scope): T = createOrGetScopedInstance(scope, hashCode()) { factory(InternalScoped(scope)) } 31 | } 32 | 33 | inline fun ShankModule.scoped(crossinline factory: Scoped.(P1) -> T): ScopedProvider1 = object : ScopedProvider1 { 34 | @Synchronized 35 | override fun invoke(scope: Scope, p1: P1): T = createOrGetScopedInstance(scope, shankInternalMashHashCodes(this, p1)) { factory(InternalScoped(scope), p1) } 36 | } 37 | 38 | inline fun ShankModule.scoped(crossinline factory: Scoped.(P1, P2) -> T): ScopedProvider2 = object : ScopedProvider2 { 39 | @Synchronized 40 | override fun invoke(scope: Scope, p1: P1, p2: P2): T = 41 | createOrGetScopedInstance(scope, shankInternalMashHashCodes(this, p1, p2)) { factory(InternalScoped(scope), p1, p2) } 42 | } 43 | 44 | inline fun ShankModule.scoped(crossinline factory: Scoped.(P1, P2, P3) -> T): ScopedProvider3 = 45 | object : ScopedProvider3 { 46 | @Synchronized 47 | override fun invoke(scope: Scope, p1: P1, p2: P2, p3: P3): T = 48 | createOrGetScopedInstance(scope, shankInternalMashHashCodes(this, p1, p2, p3)) { factory(InternalScoped(scope), p1, p2, p3) } 49 | } 50 | 51 | inline fun ShankModule.scoped(crossinline factory: Scoped.(P1, P2, P3, P4) -> T): ScopedProvider4 = 52 | object : ScopedProvider4 { 53 | @Synchronized 54 | override fun invoke(scope: Scope, p1: P1, p2: P2, p3: P3, p4: P4): T = 55 | createOrGetScopedInstance(scope, shankInternalMashHashCodes(this, p1, p2, p3, p4)) { factory(InternalScoped(scope), p1, p2, p3, p4) } 56 | } 57 | 58 | inline fun ShankModule.scoped(crossinline factory: Scoped.(P1, P2, P3, P4, P5) -> T): ScopedProvider5 = 59 | object : ScopedProvider5 { 60 | @Synchronized 61 | override fun invoke(scope: Scope, p1: P1, p2: P2, p3: P3, p4: P4, p5: P5): T = 62 | createOrGetScopedInstance(scope, shankInternalMashHashCodes(this, p1, p2, p3, p4, p5)) { factory(InternalScoped(scope), p1, p2, p3, p4, p5) } 63 | } 64 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 128 | -------------------------------------------------------------------------------- /android/src/main/java/life/shank/android/ParentScoped.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("NOTHING_TO_INLINE") 2 | 3 | package life.shank.android 4 | 5 | import android.app.Activity 6 | import android.content.Context 7 | import android.content.ContextWrapper 8 | import android.view.View 9 | import android.view.ViewGroup 10 | import androidx.annotation.IdRes 11 | import androidx.appcompat.view.ContextThemeWrapper 12 | import androidx.core.view.children 13 | import androidx.core.view.doOnAttach 14 | import androidx.fragment.app.Fragment 15 | import androidx.fragment.app.FragmentActivity 16 | import androidx.fragment.app.FragmentManager 17 | import life.shank.Scope 18 | import life.shank.Scoped 19 | import java.util.UUID 20 | 21 | 22 | interface ParentScoped : AutoScoped { 23 | override fun onScopeReady(block: (Scope) -> Unit) { 24 | when (this) { 25 | is Scoped -> throw IllegalStateException("You cannot have Scoped and ParentScoped at the same time") 26 | is Fragment -> onParentScopeReadyForFragment(block) 27 | is View -> onParentScopeReadyForView(block) 28 | else -> throw IllegalArgumentException("$this is not supported") 29 | } 30 | } 31 | } 32 | 33 | private inline fun Fragment.onParentScopeReadyForFragment(noinline block: (Scope) -> Unit) { 34 | val scoped: Scoped? 35 | val autoScoped: AutoScoped? 36 | 37 | val scopedOrAutoScopedFragment = parentFragment?.findClosestScopedOrAutoScopedFragment() 38 | 39 | if (scopedOrAutoScopedFragment != null) { 40 | scoped = scopedOrAutoScopedFragment as? Scoped 41 | autoScoped = scopedOrAutoScopedFragment as? AutoScoped 42 | } else { 43 | scoped = activity as? Scoped 44 | autoScoped = activity as? AutoScoped 45 | } 46 | 47 | when { 48 | scoped != null -> block(scoped.scope) 49 | autoScoped != null -> autoScoped.onScopeReady(block) 50 | else -> throw IllegalStateException("$this does not have any parent with Scope") 51 | } 52 | } 53 | 54 | private inline fun View.onParentScopeReadyForView(noinline block: (Scope) -> Unit) { 55 | doOnAttach { 56 | val activity = activity ?: throw IllegalArgumentException("$this does not have an Activity") 57 | 58 | var scoped: Scoped? = null 59 | var autoScoped: AutoScoped? = null 60 | 61 | var parentView = parent as? View 62 | while (parentView != null && scoped == null && autoScoped == null) { 63 | when (parentView) { 64 | is Scoped -> scoped = parentView 65 | is AutoScoped -> autoScoped = parentView 66 | } 67 | parentView = parentView.parent as? View 68 | } 69 | 70 | if (scoped == null && autoScoped == null && activity is FragmentActivity) { 71 | val tag = getTag(R.id.shank_view_tag_to_find_in_parent) ?: UUID.randomUUID() 72 | setTag(R.id.shank_view_tag_to_find_in_parent, tag) 73 | 74 | val fragment = activity.supportFragmentManager.findFragmentThatContains(this) 75 | val scopedOrAutoScopedFragment = fragment?.findClosestScopedOrAutoScopedFragment() 76 | 77 | scoped = scopedOrAutoScopedFragment as? Scoped 78 | autoScoped = scopedOrAutoScopedFragment as? AutoScoped 79 | } 80 | 81 | if (scoped == null && autoScoped == null) { 82 | scoped = activity as? Scoped 83 | autoScoped = activity as? AutoScoped 84 | } 85 | 86 | when { 87 | scoped != null -> block(scoped.scope) 88 | autoScoped != null -> autoScoped.onScopeReady(block) 89 | else -> throw IllegalStateException("$this does not have any parent with Scope") 90 | } 91 | } 92 | } 93 | 94 | private inline fun Fragment.findClosestScopedOrAutoScopedFragment(): Fragment? { 95 | var fragment: Fragment? = this 96 | while (fragment != null && !(fragment is Scoped || fragment is AutoScoped)) { 97 | fragment = fragment.parentFragment 98 | } 99 | return fragment 100 | } 101 | 102 | private fun FragmentManager.findFragmentThatContains(view: View): Fragment? { 103 | return fragments.firstOrNull { 104 | val fragment = it.childFragmentManager.findFragmentThatContains(view) 105 | if (fragment != null) return fragment 106 | it.contains(view) 107 | } 108 | } 109 | 110 | private inline fun Fragment.contains(view: View) = view == this.view 111 | ?.findViewWithTag(R.id.shank_view_tag_to_find_in_parent, view.getTag(R.id.shank_view_tag_to_find_in_parent)) 112 | 113 | fun View.findViewWithTag(@IdRes idRes: Int, tag: Any): View? { 114 | if (getTag(idRes) == tag) return this 115 | if (this !is ViewGroup) return null 116 | 117 | return children.firstOrNull { 118 | val view = it.findViewWithTag(idRes, tag) 119 | if (view != null) return view 120 | false 121 | } 122 | } 123 | 124 | private val View.activity: Activity? get() = context.activity 125 | private val Context.activity: Activity? 126 | get() = when (this) { 127 | is Activity -> this 128 | is ContextThemeWrapper -> this.baseContext.activity 129 | is android.view.ContextThemeWrapper -> this.baseContext.activity 130 | is ContextWrapper -> this.baseContext.activity 131 | else -> null 132 | } 133 | -------------------------------------------------------------------------------- /android/src/main/java/life/shank/android/AutoScoped.kt: -------------------------------------------------------------------------------- 1 | package life.shank.android 2 | 3 | import android.view.View 4 | import androidx.lifecycle.LifecycleOwner 5 | import life.shank.Scope 6 | import life.shank.Scoped 7 | import life.shank.ScopedProvider0 8 | import life.shank.ScopedProvider1 9 | import life.shank.ScopedProvider2 10 | import life.shank.ScopedProvider3 11 | import life.shank.ScopedProvider4 12 | import life.shank.ScopedProvider5 13 | 14 | interface AutoScoped { 15 | val scope: Scope? 16 | get() = when (this) { 17 | is Scoped -> scope 18 | is LifecycleOwner -> LifecycleOwnerScopes.getScope(this) 19 | is View -> getScope() 20 | else -> throw IllegalArgumentException() 21 | } 22 | 23 | fun onScopeReady(block: (Scope) -> Unit) { 24 | when (this) { 25 | is Scoped -> block(scope) 26 | is LifecycleOwner -> LifecycleOwnerScopes.doOnScopeReady(this, block) 27 | is View -> onScopeReadyFor(this, block) 28 | else -> throw IllegalArgumentException() 29 | } 30 | } 31 | } 32 | 33 | internal fun onScopeReadyFor(view: View, block: (Scope) -> Unit) { 34 | val currentOnAttachListenerForScope = view.getTag(R.id.shank_view_tag) as? OnAttachListenerForScope 35 | val onAttachListenerForScope = currentOnAttachListenerForScope ?: OnAttachListenerForScope(view) 36 | 37 | onAttachListenerForScope.onScopeReady(block) 38 | 39 | view.setTag(R.id.shank_view_tag, onAttachListenerForScope) 40 | if (currentOnAttachListenerForScope == null) { 41 | view.addOnAttachStateChangeListener(onAttachListenerForScope) 42 | } 43 | } 44 | 45 | internal fun View.getScope(): Scope? { 46 | val currentOnAttachListenerForScope = getTag(R.id.shank_view_tag) as? OnAttachListenerForScope ?: return null 47 | return currentOnAttachListenerForScope.scope 48 | } 49 | 50 | fun ScopedProvider0.onReadyFor(autoScoped: AutoScoped, block: (T) -> Unit) = 51 | autoScoped.onScopeReady { block(invoke(it)) } 52 | 53 | fun ScopedProvider0.doOnReadyFor(autoScoped: AutoScoped, block: (T) -> Unit) = 54 | autoScoped.onScopeReady { block(invoke(it)) } 55 | 56 | fun ScopedProvider0.doNowIfReadyFor(autoScoped: AutoScoped, block: (T) -> Unit) = 57 | autoScoped.scope?.run { block(invoke(this)) } 58 | 59 | fun ScopedProvider1.onReadyFor(autoScoped: AutoScoped, p1: P1, block: (T) -> Unit) = 60 | autoScoped.onScopeReady { block(invoke(it, p1)) } 61 | 62 | fun ScopedProvider1.doOnReadyFor(autoScoped: AutoScoped, p1: P1, block: (T) -> Unit) = 63 | autoScoped.onScopeReady { block(invoke(it, p1)) } 64 | 65 | fun ScopedProvider1.doNowIfReadyFor(autoScoped: AutoScoped, p1: P1, block: (T) -> Unit) = 66 | autoScoped.scope?.run { block(invoke(this, p1)) } 67 | 68 | fun ScopedProvider2.onReadyFor(autoScoped: AutoScoped, p1: P1, p2: P2, block: (T) -> Unit) = 69 | autoScoped.onScopeReady { block(invoke(it, p1, p2)) } 70 | 71 | fun ScopedProvider2.doOnReadyFor(autoScoped: AutoScoped, p1: P1, p2: P2, block: (T) -> Unit) = 72 | autoScoped.onScopeReady { block(invoke(it, p1, p2)) } 73 | 74 | fun ScopedProvider2.doNowIfReadyFor(autoScoped: AutoScoped, p1: P1, p2: P2, block: (T) -> Unit) = 75 | autoScoped.scope?.run { block(invoke(this, p1, p2)) } 76 | 77 | fun ScopedProvider3.onReadyFor(autoScoped: AutoScoped, p1: P1, p2: P2, p3: P3, block: (T) -> Unit) = 78 | autoScoped.onScopeReady { block(invoke(it, p1, p2, p3)) } 79 | 80 | fun ScopedProvider3.doOnReadyFor(autoScoped: AutoScoped, p1: P1, p2: P2, p3: P3, block: (T) -> Unit) = 81 | autoScoped.onScopeReady { block(invoke(it, p1, p2, p3)) } 82 | 83 | fun ScopedProvider3.doNowIfReadyFor(autoScoped: AutoScoped, p1: P1, p2: P2, p3: P3, block: (T) -> Unit) = 84 | autoScoped.scope?.run { block(invoke(this, p1, p2, p3)) } 85 | 86 | fun ScopedProvider4.onReadyFor(autoScoped: AutoScoped, p1: P1, p2: P2, p3: P3, p4: P4, block: (T) -> Unit) = 87 | autoScoped.onScopeReady { block(invoke(it, p1, p2, p3, p4)) } 88 | 89 | fun ScopedProvider4.doOnReadyFor(autoScoped: AutoScoped, p1: P1, p2: P2, p3: P3, p4: P4, block: (T) -> Unit) = 90 | autoScoped.onScopeReady { block(invoke(it, p1, p2, p3, p4)) } 91 | 92 | fun ScopedProvider4.doNowIfReadyFor(autoScoped: AutoScoped, p1: P1, p2: P2, p3: P3, p4: P4, block: (T) -> Unit) = 93 | autoScoped.scope?.run { block(invoke(this, p1, p2, p3, p4)) } 94 | 95 | fun ScopedProvider5.onReadyFor( 96 | autoScoped: AutoScoped, 97 | p1: P1, 98 | p2: P2, 99 | p3: P3, 100 | p4: P4, 101 | p5: P5, 102 | block: (T) -> Unit 103 | ) = autoScoped.onScopeReady { block(invoke(it, p1, p2, p3, p4, p5)) } 104 | 105 | fun ScopedProvider5.doOnReadyFor( 106 | autoScoped: AutoScoped, 107 | p1: P1, 108 | p2: P2, 109 | p3: P3, 110 | p4: P4, 111 | p5: P5, 112 | block: (T) -> Unit 113 | ) = autoScoped.onScopeReady { block(invoke(it, p1, p2, p3, p4, p5)) } 114 | 115 | fun ScopedProvider5.doNowIfReadyFor( 116 | autoScoped: AutoScoped, 117 | p1: P1, 118 | p2: P2, 119 | p3: P3, 120 | p4: P4, 121 | p5: P5, 122 | block: (T) -> Unit 123 | ) = autoScoped.scope?.run { block(invoke(this, p1, p2, p3, p4, p5)) } 124 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /core/src/test/java/life/shank/ScopedProviderTests.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | import kotlinx.coroutines.Dispatchers 4 | import kotlinx.coroutines.runBlocking 5 | import life.shank.ParameterScopedModule.scoped0 6 | import life.shank.ParameterScopedModule.scoped1 7 | import life.shank.ParameterScopedModule.scoped2 8 | import life.shank.ParameterScopedModule.scoped3 9 | import life.shank.ParameterScopedModule.scoped4 10 | import life.shank.ParameterScopedModule.scoped5 11 | import org.junit.Before 12 | import org.junit.Test 13 | import shouldBeEqualTo 14 | import shouldBeSameReference 15 | import shouldBeSameReferenceAsAnyOf 16 | import shouldNotBeSameReference 17 | import testConcurrentSingletonGet 18 | 19 | 20 | private object ParameterScopedModule : ShankModule { 21 | val scoped0 = scoped { -> DataForTest() } 22 | val scoped1 = scoped { a: Int -> DataForTest(a) } 23 | val scoped2 = scoped { a: Int, b: Int -> DataForTest(a, b) } 24 | val scoped3 = scoped { a: Int, b: Int, c: Int -> DataForTest(a, b, c) } 25 | val scoped4 = scoped { a: Int, b: Int, c: Int, d: Int -> DataForTest(a, b, c, d) } 26 | val scoped5 = scoped { a: Int, b: Int, c: Int, d: Int, e: Int -> DataForTest(a, b, c, d, e) } 27 | } 28 | 29 | class ScopedTests : Scoped { 30 | override val scope: Scope = Scope("singleton") 31 | 32 | @Before 33 | fun setUp() { 34 | Shank.internalInstancesInScopesCache.clear() 35 | } 36 | 37 | @Test 38 | fun `can register factories for scoped instance with up to 5 parameters`() { 39 | scoped0() shouldBeEqualTo DataForTest() 40 | scoped0() shouldBeSameReference scoped0() 41 | 42 | scoped1(1) shouldBeEqualTo DataForTest(1) 43 | scoped1(1) shouldBeSameReference scoped1(1) 44 | 45 | scoped2(1, 2) shouldBeEqualTo DataForTest(1, 2) 46 | scoped2(1, 2) shouldBeSameReference scoped2(1, 2) 47 | 48 | scoped3(1, 2, 3) shouldBeEqualTo DataForTest(1, 2, 3) 49 | scoped3(1, 2, 3) shouldBeSameReference scoped3(1, 2, 3) 50 | 51 | scoped4(1, 2, 3, 4) shouldBeEqualTo DataForTest(1, 2, 3, 4) 52 | scoped4(1, 2, 3, 4) shouldBeSameReference scoped4(1, 2, 3, 4) 53 | 54 | scoped5(1, 2, 3, 4, 5) shouldBeEqualTo DataForTest(1, 2, 3, 4, 5) 55 | scoped5(1, 2, 3, 4, 5) shouldBeSameReference scoped5(1, 2, 3, 4, 5) 56 | } 57 | 58 | @Test 59 | fun `different parameters will create new scoped for those parameters within same scope`() { 60 | scoped1(1) shouldNotBeSameReference scoped1(2) 61 | scoped2(1, 2) shouldNotBeSameReference scoped2(2, 4) 62 | scoped3(1, 2, 3) shouldNotBeSameReference scoped3(2, 4, 6) 63 | scoped4(1, 2, 3, 4) shouldNotBeSameReference scoped4(2, 4, 6, 8) 64 | scoped5(1, 2, 3, 4, 5) shouldNotBeSameReference scoped5(2, 4, 6, 8, 10) 65 | } 66 | 67 | @Test 68 | fun `supports concurrent and suspend requests`() = runBlocking(Dispatchers.Default) { 69 | testConcurrentSingletonGet { scoped0() } 70 | testConcurrentSingletonGet { scoped1(1) } 71 | testConcurrentSingletonGet { scoped2(1, 2) } 72 | testConcurrentSingletonGet { scoped3(1, 2, 3) } 73 | testConcurrentSingletonGet { scoped4(1, 2, 3, 4) } 74 | testConcurrentSingletonGet { scoped5(1, 2, 3, 4, 5) } 75 | } 76 | 77 | @Test 78 | fun `scope can be cleared`() { 79 | val initial0 = scoped0() 80 | val initial1 = scoped1(1) 81 | val initial2 = scoped2(1, 2) 82 | val initial3 = scoped3(1, 2, 3) 83 | val initial4 = scoped4(1, 2, 3, 4) 84 | val initial5 = scoped5(1, 2, 3, 4, 5) 85 | 86 | scope.clear() 87 | val new0 = scoped0() 88 | val new1 = scoped1(1) 89 | val new2 = scoped2(1, 2) 90 | val new3 = scoped3(1, 2, 3) 91 | val new4 = scoped4(1, 2, 3, 4) 92 | val new5 = scoped5(1, 2, 3, 4, 5) 93 | 94 | initial0 shouldNotBeSameReference new0 95 | initial1 shouldNotBeSameReference new1 96 | initial2 shouldNotBeSameReference new2 97 | initial3 shouldNotBeSameReference new3 98 | initial4 shouldNotBeSameReference new4 99 | initial5 shouldNotBeSameReference new5 100 | } 101 | 102 | @Test 103 | fun `multiple clear actions can be registered that will be called for every instance in scope`() { 104 | var clearAction1CallCount = 0 105 | var clearAction2CallCount = 0 106 | 107 | val value0 = scoped0() 108 | val value1 = scoped1(1) 109 | 110 | val clearAction1: (Any?) -> Unit = { any: Any? -> 111 | clearAction1CallCount++ 112 | any shouldBeSameReferenceAsAnyOf listOf(value0, value1) 113 | } 114 | val clearAction2: (Any?) -> Unit = { 115 | clearAction2CallCount++ 116 | } 117 | 118 | scope.addOnClearAction(clearAction1) 119 | scope.addOnClearAction(clearAction2) 120 | scope.clear() 121 | scope.removeOnClearAction(clearAction1) 122 | scoped0() 123 | scoped1(1) 124 | scope.clear() 125 | 126 | clearAction1CallCount shouldBeEqualTo 2 127 | clearAction2CallCount shouldBeEqualTo 4 128 | } 129 | 130 | @Test 131 | fun `multiple global clear actions can be registered that will be called for every instance in scope`() { 132 | var clearAction1CallCount = 0 133 | var clearAction2CallCount = 0 134 | 135 | val value0 = scoped0() 136 | val value1 = scoped1(1) 137 | 138 | val clearAction1: (Any?) -> Unit = { any: Any? -> 139 | clearAction1CallCount++ 140 | any shouldBeSameReferenceAsAnyOf listOf(value0, value1) 141 | } 142 | val clearAction2: (Any?) -> Unit = { 143 | clearAction2CallCount++ 144 | } 145 | 146 | Shank.addScopedInstanceClearAction(clearAction1) 147 | Shank.addScopedInstanceClearAction(clearAction2) 148 | scope.clear() 149 | Shank.removeScopedInstanceClearAction(clearAction1) 150 | scoped0() 151 | scoped1(1) 152 | scope.clear() 153 | 154 | clearAction1CallCount shouldBeEqualTo 2 155 | clearAction2CallCount shouldBeEqualTo 4 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2015-2016 memoizr 2 | 3 | Apache License 4 | Version 2.0, January 2004 5 | http://www.apache.org/licenses/ 6 | 7 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 8 | 9 | 1. Definitions. 10 | 11 | "License" shall mean the terms and conditions for use, reproduction, 12 | and distribution as defined by Sections 1 through 9 of this document. 13 | 14 | "Licensor" shall mean the copyright owner or entity authorized by 15 | the copyright owner that is granting the License. 16 | 17 | "Legal Entity" shall mean the union of the acting entity and all 18 | other entities that control, are controlled by, or are under common 19 | control with that entity. For the purposes of this definition, 20 | "control" means (i) the power, direct or indirect, to cause the 21 | direction or management of such entity, whether by contract or 22 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 23 | outstanding shares, or (iii) beneficial ownership of such entity. 24 | 25 | "You" (or "Your") shall mean an individual or Legal Entity 26 | exercising permissions granted by this License. 27 | 28 | "Source" form shall mean the preferred form for making modifications, 29 | including but not limited to software source code, documentation 30 | source, and configuration files. 31 | 32 | "Object" form shall mean any form resulting from mechanical 33 | transformation or translation of a Source form, including but 34 | not limited to compiled object code, generated documentation, 35 | and conversions to other media types. 36 | 37 | "Work" shall mean the work of authorship, whether in Source or 38 | Object form, made available under the License, as indicated by a 39 | copyright notice that is included in or attached to the work 40 | (an example is provided in the Appendix below). 41 | 42 | "Derivative Works" shall mean any work, whether in Source or Object 43 | form, that is based on (or derived from) the Work and for which the 44 | editorial revisions, annotations, elaborations, or other modifications 45 | represent, as a whole, an original work of authorship. For the purposes 46 | of this License, Derivative Works shall not include works that remain 47 | separable from, or merely link (or bind by name) to the interfaces of, 48 | the Work and Derivative Works thereof. 49 | 50 | "Contribution" shall mean any work of authorship, including 51 | the original version of the Work and any modifications or additions 52 | to that Work or Derivative Works thereof, that is intentionally 53 | submitted to Licensor for inclusion in the Work by the copyright owner 54 | or by an individual or Legal Entity authorized to submit on behalf of 55 | the copyright owner. For the purposes of this definition, "submitted" 56 | means any form of electronic, verbal, or written communication sent 57 | to the Licensor or its representatives, including but not limited to 58 | communication on electronic mailing lists, source code control systems, 59 | and issue tracking systems that are managed by, or on behalf of, the 60 | Licensor for the purpose of discussing and improving the Work, but 61 | excluding communication that is conspicuously marked or otherwise 62 | designated in writing by the copyright owner as "Not a Contribution." 63 | 64 | "Contributor" shall mean Licensor and any individual or Legal Entity 65 | on behalf of whom a Contribution has been received by Licensor and 66 | subsequently incorporated within the Work. 67 | 68 | 2. Grant of Copyright License. Subject to the terms and conditions of 69 | this License, each Contributor hereby grants to You a perpetual, 70 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 71 | copyright license to reproduce, prepare Derivative Works of, 72 | publicly display, publicly perform, sublicense, and distribute the 73 | Work and such Derivative Works in Source or Object form. 74 | 75 | 3. Grant of Patent License. Subject to the terms and conditions of 76 | this License, each Contributor hereby grants to You a perpetual, 77 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 78 | (except as stated in this section) patent license to make, have made, 79 | use, offer to sell, sell, import, and otherwise transfer the Work, 80 | where such license applies only to those patent claims licensable 81 | by such Contributor that are necessarily infringed by their 82 | ntribution(s) alone or by combination of their Contribution(s) 83 | with the Work to which such Contribution(s) was submitted. If You 84 | institute patent litigation against any entity (including a 85 | cross-claim or counterclaim in a lawsuit) alleging that the Work 86 | or a Contribution incorporated within the Work constitutes direct 87 | or contributory patent infringement, then any patent licenses 88 | granted to You under this License for that Work shall terminate 89 | as of the date such litigation is filed. 90 | 91 | 4. Redistribution. You may reproduce and distribute copies of the 92 | Work or Derivative Works thereof in any medium, with or without 93 | modifications, and in Source or Object form, provided that You 94 | meet the following conditions: 95 | 96 | (a) You must give any other recipients of the Work or 97 | Derivative Works a copy of this License; and 98 | 99 | (b) You must cause any modified files to carry prominent notices 100 | stating that You changed the files; and 101 | 102 | (c) You must retain, in the Source form of any Derivative Works 103 | that You distribute, all copyright, patent, trademark, and 104 | attribution notices from the Source form of the Work, 105 | excluding those notices that do not pertain to any part of 106 | the Derivative Works; and 107 | 108 | (d) If the Work includes a "NOTICE" text file as part of its 109 | distribution, then any Derivative Works that You distribute must 110 | include a readable copy of the attribution notices contained 111 | within such NOTICE file, excluding those notices that do not 112 | pertain to any part of the Derivative Works, in at least one 113 | of the following places: within a NOTICE text file distributed 114 | as part of the Derivative Works; within the Source form or 115 | documentation, if provided along with the Derivative Works; or, 116 | within a display generated by the Derivative Works, if and 117 | wherever such third-party notices normally appear. The contents 118 | of the NOTICE file are for informational purposes only and 119 | do not modify the License. You may add Your own attribution 120 | notices within Derivative Works that You distribute, alongside 121 | or as an addendum to the NOTICE text from the Work, provided 122 | that such additional attribution notices cannot be construed 123 | as modifying the License. 124 | 125 | You may add Your own copyright statement to Your modifications and 126 | may provide additional or different license terms and conditions 127 | for use, reproduction, or distribution of Your modifications, or 128 | for any such Derivative Works as a whole, provided Your use, 129 | reproduction, and distribution of the Work otherwise complies with 130 | the conditions stated in this License. 131 | 132 | 5. Submission of Contributions. Unless You explicitly state otherwise, 133 | any Contribution intentionally submitted for inclusion in the Work 134 | by You to the Licensor shall be under the terms and conditions of 135 | this License, without any additional terms or conditions. 136 | Notwithstanding the above, nothing herein shall supersede or modify 137 | the terms of any separate license agreement you may have executed 138 | with Licensor regarding such Contributions. 139 | 140 | 6. Trademarks. This License does not grant permission to use the trade 141 | names, trademarks, service marks, or product names of the Licensor, 142 | except as required for reasonable and customary use in describing the 143 | origin of the Work and reproducing the content of the NOTICE file. 144 | 145 | 7. Disclaimer of Warranty. Unless required by applicable law or 146 | agreed to in writing, Licensor provides the Work (and each 147 | Contributor provides its Contributions) on an "AS IS" BASIS, 148 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 149 | implied, including, without limitation, any warranties or conditions 150 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 151 | PARTICULAR PURPOSE. You are solely responsible for determining the 152 | appropriateness of using or redistributing the Work and assume any 153 | risks associated with Your exercise of permissions under this License. 154 | 155 | 8. Limitation of Liability. In no event and under no legal theory, 156 | whether in tort (including negligence), contract, or otherwise, 157 | unless required by applicable law (such as deliberate and grossly 158 | negligent acts) or agreed to in writing, shall any Contributor be 159 | liable to You for damages, including any direct, indirect, special, 160 | incidental, or consequential damages of any character arising as a 161 | result of this License or out of the use or inability to use the 162 | Work (including but not limited to damages for loss of goodwill, 163 | work stoppage, computer failure or malfunction, or any and all 164 | other commercial damages or losses), even if such Contributor 165 | has been advised of the possibility of such damages. 166 | 167 | 9. Accepting Warranty or Additional Liability. While redistributing 168 | the Work or Derivative Works thereof, You may choose to offer, 169 | and charge a fee for, acceptance of support, warranty, indemnity, 170 | or other liability obligations and/or rights consistent with this 171 | License. However, in accepting such obligations, You may act only 172 | on Your own behalf and on Your sole responsibility, not on behalf 173 | of any other Contributor, and only if You agree to indemnify, 174 | defend, and hold each Contributor harmless for any liability 175 | incurred by, or claims asserted against, such Contributor by reason 176 | of your accepting any such warranty or additional liability. 177 | 178 | END OF TERMS AND CONDITIONS 179 | 180 | APPENDIX: How to apply the Apache License to your work. 181 | 182 | To apply the Apache License to your work, attach the following 183 | boilerplate notice, with the fields enclosed by brackets "[]" 184 | replaced with your own identifying information. (Don't include 185 | the brackets!) The text should be enclosed in the appropriate 186 | comment syntax for the file format. We also recommend that a 187 | file or class name and description of purpose be included on the 188 | same "printed page" as the copyright notice for easier 189 | identification within third-party archives. 190 | -------------------------------------------------------------------------------- /core/src/main/java/life/shank/HashcodeHashMap.java: -------------------------------------------------------------------------------- 1 | package life.shank; 2 | 3 | 4 | @SuppressWarnings("unchecked") 5 | public class HashcodeHashMap { 6 | private static final int DEFAULT_CAPACITY = 128; 7 | private static final int MAXIMUM_CAPACITY = 1 << 29; 8 | transient int[] keys; // non-private to simplify nested class access 9 | transient Object[] values; // non-private to simplify nested class access 10 | int size; 11 | transient int modCount; 12 | static final int NULL_KEY = 0; 13 | 14 | private static int maskNull(int key) { 15 | return (key == 0 ? NULL_KEY : key); 16 | } 17 | 18 | public HashcodeHashMap() { 19 | keys = new int[DEFAULT_CAPACITY]; 20 | values = new Object[DEFAULT_CAPACITY]; 21 | } 22 | 23 | public int size() { 24 | return size; 25 | } 26 | 27 | public boolean isEmpty() { 28 | return size == 0; 29 | } 30 | 31 | 32 | private static int hash(int h, int length) { 33 | // Multiply by -127, and left-shift to use least bit as part of hash 34 | return ((h << 1) - (h << 8)) & (length - 1); 35 | } 36 | 37 | private static int nextKeyIndex(int i, int len) { 38 | return (i + 1 < len ? i + 1 : 0); 39 | } 40 | 41 | public V get(Object key) { 42 | int h = key.hashCode(); 43 | int k = (h == 0 ? NULL_KEY : h); 44 | int[] tab = keys; 45 | Object[] vals = values; 46 | int len = tab.length; 47 | // Multiply by -127, and left-shift to use least bit as part of hash 48 | int i = ((k << 1) - (k << 8)) & (len - 1); 49 | while (true) { 50 | int item = tab[i]; 51 | if (item == k) 52 | return (V) vals[i]; 53 | if (item == 0) 54 | return null; 55 | i = (i + 1 < len ? i + 1 : 0); 56 | } 57 | } 58 | 59 | public V get(int key) { 60 | int k = (key == 0 ? NULL_KEY : key); 61 | int[] tab = keys; 62 | Object[] vals = values; 63 | int len = tab.length; 64 | // Multiply by -127, and left-shift to use least bit as part of hash 65 | int i = ((k << 1) - (k << 8)) & (len - 1); 66 | while (true) { 67 | int item = tab[i]; 68 | if (item == k) 69 | return (V) vals[i]; 70 | if (item == 0) 71 | return null; 72 | i = (i + 1 < len ? i + 1 : 0); 73 | } 74 | } 75 | 76 | public boolean containsKey(int key) { 77 | int k = (key == 0 ? NULL_KEY : key); 78 | int[] tab = keys; 79 | int len = tab.length; 80 | // Multiply by -127, and left-shift to use least bit as part of hash 81 | int i = ((k << 1) - (k << 8)) & (len - 1); 82 | while (true) { 83 | int item = tab[i]; 84 | if (item == k) 85 | return true; 86 | if (item == NULL_KEY) 87 | return false; 88 | i = (i + 1 < len ? i + 1 : 0); 89 | } 90 | } 91 | 92 | public V put(Object key, V value) { 93 | int h = key.hashCode(); 94 | final int k = (h == 0 ? NULL_KEY : h); 95 | 96 | retryAfterResize: 97 | for (; ; ) { 98 | final int[] kk = keys; 99 | final int len = kk.length; 100 | // Multiply by -127, and left-shift to use least bit as part of hash 101 | int i = ((k << 1) - (k << 8)) & (len - 1); 102 | 103 | for (int item; (item = kk[i]) != NULL_KEY; 104 | i = (i + 1 < len ? i + 1 : 0)) { 105 | if (item == k) { 106 | @SuppressWarnings("unchecked") 107 | V oldValue = (V) values[i]; 108 | values[i] = value; 109 | return oldValue; 110 | } 111 | } 112 | 113 | final int s = size + 1; 114 | // Use optimized form of 3 * s. 115 | // Next capacity is len, 2 * current capacity. 116 | if (s + (s << 1) > len && resize(len)) 117 | continue retryAfterResize; 118 | 119 | modCount++; 120 | keys[i] = k; 121 | values[i] = value; 122 | size = s; 123 | return null; 124 | } 125 | } 126 | 127 | public V put(int key, V value) { 128 | final int k = (key == 0 ? NULL_KEY : key); 129 | 130 | retryAfterResize: 131 | for (; ; ) { 132 | final int[] kk = keys; 133 | final int len = kk.length; 134 | // Multiply by -127, and left-shift to use least bit as part of hash 135 | int i = ((k << 1) - (k << 8)) & (len - 1); 136 | 137 | for (int item; (item = kk[i]) != NULL_KEY; 138 | i = (i + 1 < len ? i + 1 : 0)) { 139 | if (item == k) { 140 | @SuppressWarnings("unchecked") 141 | V oldValue = (V) values[i]; 142 | values[i] = value; 143 | return oldValue; 144 | } 145 | } 146 | 147 | final int s = size + 1; 148 | // Use optimized form of 3 * s. 149 | // Next capacity is len, 2 * current capacity. 150 | if (s * 3 > len && resize(len)) 151 | continue retryAfterResize; 152 | 153 | modCount++; 154 | keys[i] = k; 155 | values[i] = value; 156 | size = s; 157 | return null; 158 | } 159 | } 160 | 161 | private boolean resize(int newCapacity) { 162 | // assert (newCapacity & -newCapacity) == newCapacity; // power of 2 163 | int newLength = newCapacity * 2; 164 | 165 | int[] oldKeys = keys; 166 | Object[] oldValues = values; 167 | int oldLength = oldKeys.length; 168 | if (oldLength == 2 * MAXIMUM_CAPACITY) { // can't expand any further 169 | if (size == MAXIMUM_CAPACITY - 1) 170 | throw new IllegalStateException("Capacity exhausted."); 171 | return false; 172 | } 173 | if (oldLength >= newLength) 174 | return false; 175 | 176 | int[] newKeys = new int[newLength]; 177 | Object[] newValues = new Object[newLength]; 178 | 179 | for (int j = 0; j < oldLength; j += 1) { 180 | int key = oldKeys[j]; 181 | if (key != NULL_KEY) { 182 | Object value = oldValues[j]; 183 | oldKeys[j] = NULL_KEY; 184 | oldValues[j] = null; 185 | // Multiply by -127, and left-shift to use least bit as part of hash 186 | int i = ((key << 1) - (key << 8)) & (newLength - 1); 187 | while (newKeys[i] != NULL_KEY) 188 | i = (i + 1 < newLength ? i + 1 : 0); 189 | newKeys[i] = key; 190 | newValues[i] = value; 191 | } 192 | } 193 | keys = newKeys; 194 | values = newValues; 195 | return true; 196 | } 197 | 198 | /** 199 | * Removes the mapping for this key from this map if present. 200 | * 201 | * @param key key whose mapping is to be removed from the map 202 | * @return the previous value associated with key, or 203 | * null if there was no mapping for key. 204 | * (A null return can also indicate that the map 205 | * previously associated null with key.) 206 | */ 207 | public V remove(int key) { 208 | int k = (key == 0 ? NULL_KEY : key); 209 | int[] tab = keys; 210 | Object[] vals = values; 211 | int len = tab.length; 212 | // Multiply by -127, and left-shift to use least bit as part of hash 213 | int i = ((k << 1) - (k << 8)) & (len - 1); 214 | 215 | while (true) { 216 | int item = tab[i]; 217 | if (item == k) { 218 | modCount++; 219 | size--; 220 | @SuppressWarnings("unchecked") 221 | V oldValue = (V) vals[i]; 222 | vals[i] = null; 223 | tab[i] = NULL_KEY; 224 | closeDeletion(i); 225 | return oldValue; 226 | } 227 | if (item == NULL_KEY) 228 | return null; 229 | i = (i + 1 < len ? i + 1 : 0); 230 | } 231 | } 232 | 233 | /** 234 | * Rehash all possibly-colliding entries following a 235 | * deletion. This preserves the linear-probe 236 | * collision properties required by get, put, etc. 237 | * 238 | * @param d the index of a newly empty deleted slot 239 | */ 240 | private void closeDeletion(int d) { 241 | // Adapted from Knuth Section 6.4 Algorithm R 242 | int[] tab = keys; 243 | Object[] vals = values; 244 | int len = tab.length; 245 | 246 | // Look for items to swap into newly vacated slot 247 | // starting at index immediately following deletion, 248 | // and continuing until a null slot is seen, indicating 249 | // the end of a run of possibly-colliding keys. 250 | int item; 251 | for (int i = (d + 1 < len ? d + 1 : 0); (item = tab[i]) != NULL_KEY; 252 | i = (i + 1 < len ? i + 1 : 0)) { 253 | // The following test triggers if the item at slot i (which 254 | // hashes to be at slot r) should take the spot vacated by d. 255 | // If so, we swap it in, and then continue with d now at the 256 | // newly vacated i. This process will terminate when we hit 257 | // the null slot at the end of this run. 258 | // The test is messy because we are using a circular table. 259 | // Multiply by -127, and left-shift to use least bit as part of hash 260 | int r = ((item << 1) - (item << 8)) & (len - 1); 261 | if ((i < r && (r <= d || d <= i)) || (r <= d && d <= i)) { 262 | tab[d] = item; 263 | vals[d] = vals[i]; 264 | tab[i] = NULL_KEY; 265 | vals[i] = null; 266 | d = i; 267 | } 268 | } 269 | } 270 | 271 | /** 272 | * Removes all of the mappings from this map. 273 | * The map will be empty after this call returns. 274 | */ 275 | public void clear() { 276 | modCount++; 277 | int[] tab = keys; 278 | Object[] vals = values; 279 | for (int i = 0; i < tab.length; i++) { 280 | tab[i] = NULL_KEY; 281 | vals[i] = null; 282 | } 283 | size = 0; 284 | } 285 | } 286 | -------------------------------------------------------------------------------- /core/src/test/java/life/shank/Module1.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | object Module1 : ShankModule { 4 | val fib1 = new { -> Fib1() } 5 | val fib2 = new { -> Fib2() } 6 | val fib3 = new { -> Fib3(fib2(), fib1()) } 7 | val fib4 = new { -> Fib4(fib3(), fib2()) } 8 | val fib5 = new { -> Fib5(fib4(), fib3()) } 9 | val fib6 = new { -> Fib6(fib5(), fib4()) } 10 | val fib7 = new { -> Fib7(fib6(), fib5()) } 11 | val fib8 = new { -> Fib8(fib7(), fib6()) } 12 | // val fib9: NewProvider = new { -> Fib9(fib8(), fib7()) } 13 | // val fib10: NewProvider = new { -> Fib10(fib9(), fib8()) } 14 | // val fib11: NewProvider = new { -> Fib11(fib10(), fib9()) } 15 | // val fib12: NewProvider = new { -> Fib12(fib11(), fib10()) } 16 | // val fib13: NewProvider = new { -> Fib13(fib12(), fib11()) } 17 | // val fib14: NewProvider = new { -> Fib14(fib13(), fib12()) } 18 | // val fib15: NewProvider = new { -> Fib15(fib14(), fib13()) } 19 | // val fib16: NewProvider = new { -> Fib16(fib15(), fib14()) } 20 | // val fib17: NewProvider = new { -> Fib17(fib16(), fib15()) } 21 | // val fib18: NewProvider = new { -> Fib18(fib17(), fib16()) } 22 | // val fib19: NewProvider = new { -> Fib19(fib18(), fib17()) } 23 | // val fib20: NewProvider = new { -> Fib20(fib19(), fib18()) } //} // //object Module2 : ShankModule() { 24 | // val fib21: NewProvider = new { -> Fib21(fib20(), fib19()) } 25 | // val fib22: NewProvider = new { -> Fib22(fib21(), fib20()) } 26 | // val fib23: NewProvider = new { -> Fib23(fib22(), fib21()) } 27 | // val fib24: NewProvider = new { -> Fib24(fib23(), fib22()) } 28 | // val fib25: NewProvider = new { -> Fib25(fib24(), fib23()) } 29 | // val fib26: NewProvider = new { -> Fib26(fib25(), fib24()) } 30 | // val fib27: NewProvider = new { -> Fib27(fib26(), fib25()) } 31 | // val fib28: NewProvider = new { -> Fib28(fib27(), fib26()) } 32 | // val fib29: NewProvider = new { -> Fib29(fib28(), fib27()) } 33 | // val fib30: NewProvider = new { -> Fib30(fib29(), fib28()) } 34 | // val fib31: NewProvider = new { -> Fib31(fib30(), fib29()) } 35 | // val fib32: NewProvider = new { -> Fib32(fib33()) } 36 | // val fib33: NewProvider = new { -> Fib33(fib34()) } 37 | // val fib34: NewProvider = new { -> Fib34(fib35()) } 38 | // val fib35: NewProvider = new { -> Fib35(fib36()) } 39 | // val fib36: NewProvider = new { -> Fib36(fib37()) } 40 | // val fib37: NewProvider = new { -> Fib37(fib38()) } 41 | // val fib38: NewProvider = new { -> Fib38(fib39()) } 42 | // val fib39: NewProvider = new { -> Fib39(fib40()) } 43 | // val fib40: NewProvider = new { -> Fib40(fib41()) } //} // //object Module3 : ShankModule() { 44 | // val fib41: NewProvider = new { -> Fib41(fib42()) } 45 | // val fib42: NewProvider = new { -> Fib42(fib43()) } 46 | // val fib43: NewProvider = new { -> Fib43(fib44()) } 47 | // val fib44: NewProvider = new { -> Fib44(fib45()) } 48 | // val fib45: NewProvider = new { -> Fib45(fib46()) } 49 | // val fib46: NewProvider = new { -> Fib46(fib47()) } 50 | // val fib47: NewProvider = new { -> Fib47(fib48()) } 51 | // val fib48: NewProvider = new { -> Fib48(fib49()) } 52 | // val fib49: NewProvider = new { -> Fib49(fib50()) } 53 | // val fib50: NewProvider = new { -> Fib50(fib51()) } 54 | // val fib51: NewProvider = new { -> Fib51(fib52()) } 55 | // val fib52: NewProvider = new { -> Fib52(fib53()) } 56 | // val fib53: NewProvider = new { -> Fib53(fib54()) } 57 | // val fib54: NewProvider = new { -> Fib54(fib55()) } 58 | // val fib55: NewProvider = new { -> Fib55(fib56()) } 59 | // val fib56: NewProvider = new { -> Fib56(fib57()) } 60 | // val fib57: NewProvider = new { -> Fib57(fib58()) } 61 | // val fib58: NewProvider = new { -> Fib58(fib59()) } 62 | // val fib59: NewProvider = new { -> Fib59(fib60()) } 63 | // val fib60: NewProvider = new { -> Fib60(fib61()) } 64 | // val fib61: NewProvider = new { -> Fib61(fib62()) } 65 | // val fib62: NewProvider = new { -> Fib62(fib63()) } 66 | // val fib63: NewProvider = new { -> Fib63(fib64()) } 67 | // val fib64: NewProvider = new { -> Fib64(fib65()) } 68 | // val fib65: NewProvider = new { -> Fib65(fib66()) } 69 | // val fib66: NewProvider = new { -> Fib66(fib67()) } 70 | // val fib67: NewProvider = new { -> Fib67(fib68()) } 71 | // val fib68: NewProvider = new { -> Fib68(fib69()) } 72 | // val fib69: NewProvider = new { -> Fib69(fib70()) } 73 | // val fib70: NewProvider = new { -> Fib70(fib71()) } 74 | // val fib71: NewProvider = new { -> Fib71(fib72()) } 75 | // val fib72: NewProvider = new { -> Fib72(fib73()) } 76 | // val fib73: NewProvider = new { -> Fib73(fib74()) } 77 | // val fib74: NewProvider = new { -> Fib74(fib75()) } 78 | // val fib75: NewProvider = new { -> Fib75(fib76()) } 79 | // val fib76: NewProvider = new { -> Fib76(fib77()) } 80 | // val fib77: NewProvider = new { -> Fib77(fib78()) } 81 | // val fib78: NewProvider = new { -> Fib78(fib79()) } 82 | // val fib79: NewProvider = new { -> Fib79(fib80()) } 83 | // val fib80: NewProvider = new { -> Fib80(fib81()) } //} // //object Module4 : ShankModule() { 84 | // val fib81: NewProvider = new { -> Fib81(fib82()) } 85 | // val fib82: NewProvider = new { -> Fib82(fib83()) } 86 | // val fib83: NewProvider = new { -> Fib83(fib84()) } 87 | // val fib84: NewProvider = new { -> Fib84(fib85()) } 88 | // val fib85: NewProvider = new { -> Fib85(fib86()) } 89 | // val fib86: NewProvider = new { -> Fib86(fib87()) } 90 | // val fib87: NewProvider = new { -> Fib87(fib88()) } 91 | // val fib88: NewProvider = new { -> Fib88(fib89()) } 92 | // val fib89: NewProvider = new { -> Fib89(fib90()) } 93 | // val fib90: NewProvider = new { -> Fib90(fib91()) } 94 | // val fib91: NewProvider = new { -> Fib91(fib92()) } 95 | // val fib92: NewProvider = new { -> Fib92(fib93()) } 96 | // val fib93: NewProvider = new { -> Fib93(fib94()) } 97 | // val fib94: NewProvider = new { -> Fib94(fib95()) } 98 | // val fib95: NewProvider = new { -> Fib95(fib96()) } 99 | // val fib96: NewProvider = new { -> Fib96(fib97()) } 100 | // val fib97: NewProvider = new { -> Fib97(fib98()) } 101 | // val fib98: NewProvider = new { -> Fib98(fib99()) } 102 | // val fib99: NewProvider = new { -> Fib99(fib100()) } 103 | // val fib100: NewProvider = new { -> Fib100(fib101()) } 104 | // val fib101: NewProvider = new { -> Fib101(fib102()) } 105 | // val fib102: NewProvider = new { -> Fib102(fib103()) } 106 | // val fib103: NewProvider = new { -> Fib103(fib104()) } 107 | // val fib104: NewProvider = new { -> Fib104(fib105()) } 108 | // val fib105: NewProvider = new { -> Fib105(fib106()) } 109 | // val fib106: NewProvider = new { -> Fib106(fib107()) } 110 | // val fib107: NewProvider = new { -> Fib107(fib108()) } 111 | // val fib108: NewProvider = new { -> Fib108(fib109()) } 112 | // val fib109: NewProvider = new { -> Fib109(fib110()) } 113 | // val fib110: NewProvider = new { -> Fib110(fib111()) } 114 | // val fib111: NewProvider = new { -> Fib111(fib112()) } 115 | // val fib112: NewProvider = new { -> Fib112(fib113()) } 116 | // val fib113: NewProvider = new { -> Fib113(fib114()) } 117 | // val fib114: NewProvider = new { -> Fib114(fib115()) } 118 | // val fib115: NewProvider = new { -> Fib115(fib116()) } 119 | // val fib116: NewProvider = new { -> Fib116(fib117()) } 120 | // val fib117: NewProvider = new { -> Fib117(fib118()) } 121 | // val fib118: NewProvider = new { -> Fib118(fib119()) } 122 | // val fib119: NewProvider = new { -> Fib119(fib120()) } 123 | // val fib120: NewProvider = new { -> Fib120(fib121()) } //} // //object Module5 : ShankModule() { 124 | // val fib121: NewProvider = new { -> Fib121(fib122()) } 125 | // val fib122: NewProvider = new { -> Fib122(fib123()) } 126 | // val fib123: NewProvider = new { -> Fib123(fib124()) } 127 | // val fib124: NewProvider = new { -> Fib124(fib125()) } 128 | // val fib125: NewProvider = new { -> Fib125(fib126()) } 129 | // val fib126: NewProvider = new { -> Fib126(fib127()) } 130 | // val fib127: NewProvider = new { -> Fib127(fib128()) } 131 | // val fib128: NewProvider = new { -> Fib128(fib129()) } 132 | // val fib129: NewProvider = new { -> Fib129(fib130()) } 133 | // val fib130: NewProvider = new { -> Fib130(fib131()) } 134 | // val fib131: NewProvider = new { -> Fib131(fib132()) } 135 | // val fib132: NewProvider = new { -> Fib132(fib133()) } 136 | // val fib133: NewProvider = new { -> Fib133(fib134()) } 137 | // val fib134: NewProvider = new { -> Fib134(fib135()) } 138 | // val fib135: NewProvider = new { -> Fib135(fib136()) } 139 | // val fib136: NewProvider = new { -> Fib136(fib137()) } 140 | // val fib137: NewProvider = new { -> Fib137(fib138()) } 141 | // val fib138: NewProvider = new { -> Fib138(fib139()) } 142 | // val fib139: NewProvider = new { -> Fib139(fib140()) } 143 | // val fib140: NewProvider = new { -> Fib140(fib141()) } //} // //object Module6 : ShankModule() { 144 | // val fib141: NewProvider = new { -> Fib141(fib142()) } 145 | // val fib142: NewProvider = new { -> Fib142(fib143()) } 146 | // val fib143: NewProvider = new { -> Fib143(fib144()) } 147 | // val fib144: NewProvider = new { -> Fib144(fib145()) } 148 | // val fib145: NewProvider = new { -> Fib145(fib146()) } 149 | // val fib146: NewProvider = new { -> Fib146(fib147()) } 150 | // val fib147: NewProvider = new { -> Fib147(fib148()) } 151 | // val fib148: NewProvider = new { -> Fib148(fib149()) } 152 | // val fib149: NewProvider = new { -> Fib149(fib150()) } 153 | // val fib150: NewProvider = new { -> Fib150(fib151()) } 154 | // val fib151: NewProvider = new { -> Fib151(fib152()) } 155 | // val fib152: NewProvider = new { -> Fib152(fib153()) } 156 | // val fib153: NewProvider = new { -> Fib153(fib154()) } 157 | // val fib154: NewProvider = new { -> Fib154(fib155()) } 158 | // val fib155: NewProvider = new { -> Fib155(fib156()) } 159 | // val fib156: NewProvider = new { -> Fib156(fib157()) } 160 | // val fib157: NewProvider = new { -> Fib157(fib158()) } 161 | // val fib158: NewProvider = new { -> Fib158(fib159()) } 162 | // val fib159: NewProvider = new { -> Fib159(fib160()) } 163 | // val fib160: NewProvider = new { -> Fib160(fib161()) } //} // //object Module7 : ShankModule() { 164 | // val fib161: NewProvider = new { -> Fib161(fib162()) } 165 | // val fib162: NewProvider = new { -> Fib162(fib163()) } 166 | // val fib163: NewProvider = new { -> Fib163(fib164()) } 167 | // val fib164: NewProvider = new { -> Fib164(fib165()) } 168 | // val fib165: NewProvider = new { -> Fib165(fib166()) } 169 | // val fib166: NewProvider = new { -> Fib166(fib167()) } 170 | // val fib167: NewProvider = new { -> Fib167(fib168()) } 171 | // val fib168: NewProvider = new { -> Fib168(fib169()) } 172 | // val fib169: NewProvider = new { -> Fib169(fib170()) } 173 | // val fib170: NewProvider = new { -> Fib170(fib171()) } 174 | // val fib171: NewProvider = new { -> Fib171(fib172()) } 175 | // val fib172: NewProvider = new { -> Fib172(fib173()) } 176 | // val fib173: NewProvider = new { -> Fib173(fib174()) } 177 | // val fib174: NewProvider = new { -> Fib174(fib175()) } 178 | // val fib175: NewProvider = new { -> Fib175(fib176()) } 179 | // val fib176: NewProvider = new { -> Fib176(fib177()) } 180 | // val fib177: NewProvider = new { -> Fib177(fib178()) } 181 | // val fib178: NewProvider = new { -> Fib178(fib179()) } 182 | // val fib179: NewProvider = new { -> Fib179(fib180()) } 183 | // val fib180: NewProvider = new { -> Fib180(fib181()) } //} // //object Module8 : ShankModule() { 184 | // val fib181: NewProvider = new { -> Fib181(fib182()) } 185 | // val fib182: NewProvider = new { -> Fib182(fib183()) } 186 | // val fib183: NewProvider = new { -> Fib183(fib184()) } 187 | // val fib184: NewProvider = new { -> Fib184(fib185()) } 188 | // val fib185: NewProvider = new { -> Fib185(fib186()) } 189 | // val fib186: NewProvider = new { -> Fib186(fib187()) } 190 | // val fib187: NewProvider = new { -> Fib187(fib188()) } 191 | // val fib188: NewProvider = new { -> Fib188(fib189()) } 192 | // val fib189: NewProvider = new { -> Fib189(fib190()) } 193 | // val fib190: NewProvider = new { -> Fib190(fib191()) } 194 | // val fib191: NewProvider = new { -> Fib191(fib192()) } 195 | // val fib192: NewProvider = new { -> Fib192(fib193()) } 196 | // val fib193: NewProvider = new { -> Fib193(fib194()) } 197 | // val fib194: NewProvider = new { -> Fib194(fib195()) } 198 | // val fib195: NewProvider = new { -> Fib195(fib196()) } 199 | // val fib196: NewProvider = new { -> Fib196(fib197()) } 200 | // val fib197: NewProvider = new { -> Fib197(fib198()) } 201 | // val fib198: NewProvider = new { -> Fib198(fib199()) } 202 | // val fib199: NewProvider = new { -> Fib199(fib200()) } 203 | // val fib200: NewProvider = new { -> Fib200(fib201()) } //} // //object Module9 : ShankModule() { 204 | // val fib201: NewProvider = new { -> Fib201(fib202()) } 205 | // val fib202: NewProvider = new { -> Fib202(fib203()) } 206 | // val fib203: NewProvider = new { -> Fib203(fib204()) } 207 | // val fib204: NewProvider = new { -> Fib204(fib205()) } 208 | // val fib205: NewProvider = new { -> Fib205(fib206()) } 209 | // val fib206: NewProvider = new { -> Fib206(fib207()) } 210 | // val fib207: NewProvider = new { -> Fib207(fib208()) } 211 | // val fib208: NewProvider = new { -> Fib208(fib209()) } 212 | // val fib209: NewProvider = new { -> Fib209(fib210()) } 213 | // val fib210: NewProvider = new { -> Fib210(fib211()) } 214 | // val fib211: NewProvider = new { -> Fib211(fib212()) } 215 | // val fib212: NewProvider = new { -> Fib212(fib213()) } 216 | // val fib213: NewProvider = new { -> Fib213(fib214()) } 217 | // val fib214: NewProvider = new { -> Fib214(fib215()) } 218 | // val fib215: NewProvider = new { -> Fib215(fib216()) } 219 | // val fib216: NewProvider = new { -> Fib216(fib217()) } 220 | // val fib217: NewProvider = new { -> Fib217(fib218()) } 221 | // val fib218: NewProvider = new { -> Fib218(fib219()) } 222 | // val fib219: NewProvider = new { -> Fib219(fib220()) } 223 | // val fib220: NewProvider = new { -> Fib220(fib221()) } //} // //object Module10 : ShankModule() { 224 | // val fib221: NewProvider = new { -> Fib221(fib222()) } 225 | // val fib222: NewProvider = new { -> Fib222(fib223()) } 226 | // val fib223: NewProvider = new { -> Fib223(fib224()) } 227 | // val fib224: NewProvider = new { -> Fib224(fib225()) } 228 | // val fib225: NewProvider = new { -> Fib225(fib226()) } 229 | // val fib226: NewProvider = new { -> Fib226(fib227()) } 230 | // val fib227: NewProvider = new { -> Fib227(fib228()) } 231 | // val fib228: NewProvider = new { -> Fib228(fib229()) } 232 | // val fib229: NewProvider = new { -> Fib229(fib230()) } 233 | // val fib230: NewProvider = new { -> Fib230(fib231()) } 234 | // val fib231: NewProvider = new { -> Fib231(fib232()) } 235 | // val fib232: NewProvider = new { -> Fib232(fib233()) } 236 | // val fib233: NewProvider = new { -> Fib233(fib234()) } 237 | // val fib234: NewProvider = new { -> Fib234(fib235()) } 238 | // val fib235: NewProvider = new { -> Fib235(fib236()) } 239 | // val fib236: NewProvider = new { -> Fib236(fib237()) } 240 | // val fib237: NewProvider = new { -> Fib237(fib238()) } 241 | // val fib238: NewProvider = new { -> Fib238(fib239()) } 242 | // val fib239: NewProvider = new { -> Fib239(fib240()) } 243 | // val fib240: NewProvider = new { -> Fib240(fib241()) } //} // //object Module11 : ShankModule() { 244 | // val fib241: NewProvider = new { -> Fib241(fib242()) } 245 | // val fib242: NewProvider = new { -> Fib242(fib243()) } 246 | // val fib243: NewProvider = new { -> Fib243(fib244()) } 247 | // val fib244: NewProvider = new { -> Fib244(fib245()) } 248 | // val fib245: NewProvider = new { -> Fib245(fib246()) } 249 | // val fib246: NewProvider = new { -> Fib246(fib247()) } 250 | // val fib247: NewProvider = new { -> Fib247(fib248()) } 251 | // val fib248: NewProvider = new { -> Fib248(fib249()) } 252 | // val fib249: NewProvider = new { -> Fib249(fib250()) } 253 | // val fib250: NewProvider = new { -> Fib250(fib251()) } 254 | // val fib251: NewProvider = new { -> Fib251(fib252()) } 255 | // val fib252: NewProvider = new { -> Fib252(fib253()) } 256 | // val fib253: NewProvider = new { -> Fib253(fib254()) } 257 | // val fib254: NewProvider = new { -> Fib254(fib255()) } 258 | // val fib255: NewProvider = new { -> Fib255(fib256()) } 259 | // val fib256: NewProvider = new { -> Fib256(fib257()) } 260 | // val fib257: NewProvider = new { -> Fib257(fib258()) } 261 | // val fib258: NewProvider = new { -> Fib258(fib259()) } 262 | // val fib259: NewProvider = new { -> Fib259(fib260()) } 263 | // val fib260: NewProvider = new { -> Fib260(fib261()) } //} // //object Module12 : ShankModule() { 264 | // val fib261: NewProvider = new { -> Fib261(fib262()) }// 265 | // val fib262: NewProvider = new { -> Fib262(fib263()) }// 266 | // val fib263: NewProvider = new { -> Fib263(fib264()) }// 267 | // val fib264: NewProvider = new { -> Fib264(fib265()) }// 268 | // val fib265: NewProvider = new { -> Fib265(fib266()) }// 269 | // val fib266: NewProvider = new { -> Fib266(fib267()) }// 270 | // val fib267: NewProvider = new { -> Fib267(fib268()) }// 271 | // val fib268: NewProvider = new { -> Fib268(fib269()) }// 272 | // val fib269: NewProvider = new { -> Fib269(fib270()) }// 273 | // val fib270: NewProvider = new { -> Fib270(fib271()) }// 274 | // val fib271: NewProvider = new { -> Fib271(fib272()) }// 275 | // val fib272: NewProvider = new { -> Fib272(fib273()) }// 276 | // val fib273: NewProvider = new { -> Fib273(fib274()) }// 277 | // val fib274: NewProvider = new { -> Fib274(fib275()) }// 278 | // val fib275: NewProvider = new { -> Fib275(fib276()) }// 279 | // val fib276: NewProvider = new { -> Fib276(fib277()) }// 280 | // val fib277: NewProvider = new { -> Fib277(fib278()) }// 281 | // val fib278: NewProvider = new { -> Fib278(fib279()) }// 282 | // val fib279: NewProvider = new { -> Fib279(fib280()) }// 283 | // val fib280: NewProvider = new { -> Fib280(fib281()) }// } object Module13 : ShankModule() { 284 | // val fib281: NewProvider = new { -> Fib281(fib282()) }// 285 | // val fib282: NewProvider = new { -> Fib282(fib283()) }// 286 | // val fib283: NewProvider = new { -> Fib283(fib284()) }// 287 | // val fib284: NewProvider = new { -> Fib284(fib285()) }// 288 | // val fib285: NewProvider = new { -> Fib285(fib286()) }// 289 | // val fib286: NewProvider = new { -> Fib286(fib287()) }// 290 | // val fib287: NewProvider = new { -> Fib287(fib288()) }// 291 | // val fib288: NewProvider = new { -> Fib288(fib289()) }// 292 | // val fib289: NewProvider = new { -> Fib289(fib290()) }// 293 | // val fib290: NewProvider = new { -> Fib290(fib291()) }// 294 | // val fib291: NewProvider = new { -> Fib291(fib292()) }// 295 | // val fib292: NewProvider = new { -> Fib292(fib293()) }// 296 | // val fib293: NewProvider = new { -> Fib293(fib294()) }// 297 | // val fib294: NewProvider = new { -> Fib294(fib295()) }// 298 | // val fib295: NewProvider = new { -> Fib295(fib296()) }// 299 | // val fib296: NewProvider = new { -> Fib296(fib297()) }// 300 | // val fib297: NewProvider = new { -> Fib297(fib298()) }// 301 | // val fib298: NewProvider = new { -> Fib298(fib299()) }// 302 | // val fib299: NewProvider = new { -> Fib299(fib300()) }// 303 | // val fib300: NewProvider = new { -> Fib300(fib301()) }// } object Module14 : ShankModule() { 304 | // val fib301: NewProvider = new { -> Fib301(fib302()) }// 305 | // val fib302: NewProvider = new { -> Fib302(fib303()) }// 306 | // val fib303: NewProvider = new { -> Fib303(fib304()) }// 307 | // val fib304: NewProvider = new { -> Fib304(fib305()) }// 308 | // val fib305: NewProvider = new { -> Fib305(fib306()) }// 309 | // val fib306: NewProvider = new { -> Fib306(fib307()) }// 310 | // val fib307: NewProvider = new { -> Fib307(fib308()) }// 311 | // val fib308: NewProvider = new { -> Fib308(fib309()) }// 312 | // val fib309: NewProvider = new { -> Fib309(fib310()) }// 313 | // val fib310: NewProvider = new { -> Fib310(fib311()) }// 314 | // val fib311: NewProvider = new { -> Fib311(fib312()) }// 315 | // val fib312: NewProvider = new { -> Fib312(fib313()) }// 316 | // val fib313: NewProvider = new { -> Fib313(fib314()) }// 317 | // val fib314: NewProvider = new { -> Fib314(fib315()) }// 318 | // val fib315: NewProvider = new { -> Fib315(fib316()) }// 319 | // val fib316: NewProvider = new { -> Fib316(fib317()) }// 320 | // val fib317: NewProvider = new { -> Fib317(fib318()) }// 321 | // val fib318: NewProvider = new { -> Fib318(fib319()) }// 322 | // val fib319: NewProvider = new { -> Fib319(fib320()) }// 323 | // val fib320: NewProvider = new { -> Fib320(fib321()) }// } object Module15 : ShankModule() { 324 | // val fib321: NewProvider = new { -> Fib321(fib322()) }// 325 | // val fib322: NewProvider = new { -> Fib322(fib323()) }// 326 | // val fib323: NewProvider = new { -> Fib323(fib324()) }// 327 | // val fib324: NewProvider = new { -> Fib324(fib325()) }// 328 | // val fib325: NewProvider = new { -> Fib325(fib326()) }// 329 | // val fib326: NewProvider = new { -> Fib326(fib327()) }// 330 | // val fib327: NewProvider = new { -> Fib327(fib328()) }// 331 | // val fib328: NewProvider = new { -> Fib328(fib329()) }// 332 | // val fib329: NewProvider = new { -> Fib329(fib330()) }// 333 | // val fib330: NewProvider = new { -> Fib330(fib331()) }// 334 | // val fib331: NewProvider = new { -> Fib331(fib332()) }// 335 | // val fib332: NewProvider = new { -> Fib332(fib333()) }// 336 | // val fib333: NewProvider = new { -> Fib333(fib334()) }// 337 | // val fib334: NewProvider = new { -> Fib334(fib335()) }// 338 | // val fib335: NewProvider = new { -> Fib335(fib336()) }// 339 | // val fib336: NewProvider = new { -> Fib336(fib337()) }// 340 | // val fib337: NewProvider = new { -> Fib337(fib338()) }// 341 | // val fib338: NewProvider = new { -> Fib338(fib339()) }// 342 | // val fib339: NewProvider = new { -> Fib339(fib340()) }// 343 | // val fib340: NewProvider = new { -> Fib340(fib341()) }// } object Module16 : ShankModule() { 344 | // val fib341: NewProvider = new { -> Fib341(fib342()) }// 345 | // val fib342: NewProvider = new { -> Fib342(fib343()) }// 346 | // val fib343: NewProvider = new { -> Fib343(fib344()) }// 347 | // val fib344: NewProvider = new { -> Fib344(fib345()) }// 348 | // val fib345: NewProvider = new { -> Fib345(fib346()) }// 349 | // val fib346: NewProvider = new { -> Fib346(fib347()) }// 350 | // val fib347: NewProvider = new { -> Fib347(fib348()) }// 351 | // val fib348: NewProvider = new { -> Fib348(fib349()) }// 352 | // val fib349: NewProvider = new { -> Fib349(fib350()) }// 353 | // val fib350: NewProvider = new { -> Fib350(fib351()) }// 354 | // val fib351: NewProvider = new { -> Fib351(fib352()) }// 355 | // val fib352: NewProvider = new { -> Fib352(fib353()) }// 356 | // val fib353: NewProvider = new { -> Fib353(fib354()) }// 357 | // val fib354: NewProvider = new { -> Fib354(fib355()) }// 358 | // val fib355: NewProvider = new { -> Fib355(fib356()) }// 359 | // val fib356: NewProvider = new { -> Fib356(fib357()) }// 360 | // val fib357: NewProvider = new { -> Fib357(fib358()) }// 361 | // val fib358: NewProvider = new { -> Fib358(fib359()) }// 362 | // val fib359: NewProvider = new { -> Fib359(fib360()) }// 363 | // val fib360: NewProvider = new { -> Fib360(fib361()) }// } object Module17 : ShankModule() { 364 | // val fib361: NewProvider = new { -> Fib361(fib362()) }// 365 | // val fib362: NewProvider = new { -> Fib362(fib363()) }// 366 | // val fib363: NewProvider = new { -> Fib363(fib364()) }// 367 | // val fib364: NewProvider = new { -> Fib364(fib365()) }// 368 | // val fib365: NewProvider = new { -> Fib365(fib366()) }// 369 | // val fib366: NewProvider = new { -> Fib366(fib367()) }// 370 | // val fib367: NewProvider = new { -> Fib367(fib368()) }// 371 | // val fib368: NewProvider = new { -> Fib368(fib369()) }// 372 | // val fib369: NewProvider = new { -> Fib369(fib370()) }// 373 | // val fib370: NewProvider = new { -> Fib370(fib371()) }// 374 | // val fib371: NewProvider = new { -> Fib371(fib372()) }// 375 | // val fib372: NewProvider = new { -> Fib372(fib373()) }// 376 | // val fib373: NewProvider = new { -> Fib373(fib374()) }// 377 | // val fib374: NewProvider = new { -> Fib374(fib375()) }// 378 | // val fib375: NewProvider = new { -> Fib375(fib376()) }// 379 | // val fib376: NewProvider = new { -> Fib376(fib377()) }// 380 | // val fib377: NewProvider = new { -> Fib377(fib378()) }// 381 | // val fib378: NewProvider = new { -> Fib378(fib379()) }// 382 | // val fib379: NewProvider = new { -> Fib379(fib380()) }// 383 | // val fib380: NewProvider = new { -> Fib380(fib381()) }// } object Module18 : ShankModule() { 384 | // val fib381: NewProvider = new { -> Fib381(fib382()) }// 385 | // val fib382: NewProvider = new { -> Fib382(fib383()) }// 386 | // val fib383: NewProvider = new { -> Fib383(fib384()) }// 387 | // val fib384: NewProvider = new { -> Fib384(fib385()) }// 388 | // val fib385: NewProvider = new { -> Fib385(fib386()) }// 389 | // val fib386: NewProvider = new { -> Fib386(fib387()) }// 390 | // val fib387: NewProvider = new { -> Fib387(fib388()) }// 391 | // val fib388: NewProvider = new { -> Fib388(fib389()) }// 392 | // val fib389: NewProvider = new { -> Fib389(fib390()) }// 393 | // val fib390: NewProvider = new { -> Fib390(fib391()) }// 394 | // val fib391: NewProvider = new { -> Fib391(fib392()) }// 395 | // val fib392: NewProvider = new { -> Fib392(fib393()) }// 396 | // val fib393: NewProvider = new { -> Fib393(fib394()) }// 397 | // val fib394: NewProvider = new { -> Fib394(fib395()) }// 398 | // val fib395: NewProvider = new { -> Fib395(fib396()) }// 399 | // val fib396: NewProvider = new { -> Fib396(fib397()) }// 400 | // val fib397: NewProvider = new { -> Fib397(fib398()) }// 401 | // val fib398: NewProvider = new { -> Fib398(fib399()) }// 402 | // val fib399: NewProvider = new { -> Fib399(fib400()) }// 403 | // val fib400: NewProvider = new { -> Fib400(fib401()) }// } object Module19 : ShankModule() { 404 | // val fib401: NewProvider = new { -> Fib401(fib402()) }// 405 | // val fib402: NewProvider = new { -> Fib402(fib403()) }// 406 | // val fib403: NewProvider = new { -> Fib403(fib404()) }// 407 | // val fib404: NewProvider = new { -> Fib404(fib405()) }// 408 | // val fib405: NewProvider = new { -> Fib405(fib406()) }// 409 | // val fib406: NewProvider = new { -> Fib406(fib407()) }// 410 | // val fib407: NewProvider = new { -> Fib407(fib408()) }// 411 | // val fib408: NewProvider = new { -> Fib408(fib409()) }// 412 | // val fib409: NewProvider = new { -> Fib409(fib410()) }// 413 | // val fib410: NewProvider = new { -> Fib410(fib411()) }// 414 | // val fib411: NewProvider = new { -> Fib411(fib412()) }// 415 | // val fib412: NewProvider = new { -> Fib412(fib413()) }// 416 | // val fib413: NewProvider = new { -> Fib413(fib414()) }// 417 | // val fib414: NewProvider = new { -> Fib414(fib415()) }// 418 | // val fib415: NewProvider = new { -> Fib415(fib416()) }// 419 | // val fib416: NewProvider = new { -> Fib416(fib417()) }// 420 | // val fib417: NewProvider = new { -> Fib417(fib418()) }// 421 | // val fib418: NewProvider = new { -> Fib418(fib419()) }// 422 | // val fib419: NewProvider = new { -> Fib419(fib420()) }// 423 | // val fib420: NewProvider = new { -> Fib420(fib421()) }// 424 | // val fib421: NewProvider = new { -> Fib421(fib422()) }// 425 | // val fib422: NewProvider = new { -> Fib422(fib423()) }// 426 | // val fib423: NewProvider = new { -> Fib423(fib424()) }// 427 | // val fib424: NewProvider = new { -> Fib424(fib425()) }// } object Module20 : ShankModule() { 428 | // val fib425: NewProvider = new { -> Fib425(fib426()) }// 429 | // val fib426: NewProvider = new { -> Fib426(fib427()) }// 430 | // val fib427: NewProvider = new { -> Fib427(fib428()) }// 431 | // val fib428: NewProvider = new { -> Fib428(fib429()) }// 432 | // val fib429: NewProvider = new { -> Fib429(fib430()) }// 433 | // val fib430: NewProvider = new { -> Fib430(fib431()) }// 434 | // val fib431: NewProvider = new { -> Fib431(fib432()) }// 435 | // val fib432: NewProvider = new { -> Fib432(fib433()) }// 436 | // val fib433: NewProvider = new { -> Fib433(fib434()) }// 437 | // val fib434: NewProvider = new { -> Fib434(fib435()) }// 438 | // val fib435: NewProvider = new { -> Fib435(fib436()) }// 439 | // val fib436: NewProvider = new { -> Fib436(fib437()) }// 440 | // val fib437: NewProvider = new { -> Fib437(fib438()) }// 441 | // val fib438: NewProvider = new { -> Fib438(fib439()) }// 442 | // val fib439: NewProvider = new { -> Fib439(fib440()) }// 443 | // val fib440: NewProvider = new { -> Fib440(fib441()) }// 444 | // val fib441: NewProvider = new { -> Fib441(fib442()) }// 445 | // val fib442: NewProvider = new { -> Fib442(fib443()) }// 446 | // val fib443: NewProvider = new { -> Fib443(fib444()) }// 447 | // val fib444: NewProvider = new { -> Fib444(fib445()) }// 448 | // val fib445: NewProvider = new { -> Fib445(fib446()) }// 449 | // val fib446: NewProvider = new { -> Fib446(fib447()) }// 450 | // val fib447: NewProvider = new { -> Fib447(fib448()) }// 451 | // val fib448: NewProvider = new { -> Fib448(fib449()) }// 452 | // val fib449: NewProvider = new { -> Fib449(fib450()) }// 453 | // val fib450: NewProvider = new { -> Fib450() } 454 | } 455 | -------------------------------------------------------------------------------- /core/src/test/java/life/shank/Fib.kt: -------------------------------------------------------------------------------- 1 | package life.shank 2 | 3 | interface Fib { 4 | val fib: Fib? 5 | val fiba: Fib? 6 | 7 | fun number(): Long = (fib?.number()?.plus(fiba?.number() ?: 1)) ?: 1 8 | } 9 | data class Fib1(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 10 | data class Fib2(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 11 | data class Fib3(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 12 | data class Fib4(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 13 | data class Fib5(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 14 | data class Fib6(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 15 | data class Fib7(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 16 | data class Fib8(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 17 | data class Fib9(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 18 | data class Fib10(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 19 | data class Fib11(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 20 | data class Fib12(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 21 | data class Fib13(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 22 | data class Fib14(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 23 | data class Fib15(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 24 | data class Fib16(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 25 | data class Fib17(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 26 | data class Fib18(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 27 | data class Fib19(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 28 | data class Fib20(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 29 | data class Fib21(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 30 | data class Fib22(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 31 | data class Fib23(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 32 | data class Fib24(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 33 | data class Fib25(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 34 | data class Fib26(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 35 | data class Fib27(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 36 | data class Fib28(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 37 | data class Fib29(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 38 | data class Fib30(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 39 | data class Fib31(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 40 | data class Fib32(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 41 | data class Fib33(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 42 | data class Fib34(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 43 | data class Fib35(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 44 | data class Fib36(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 45 | data class Fib37(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 46 | data class Fib38(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 47 | data class Fib39(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 48 | data class Fib40(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 49 | data class Fib41(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 50 | data class Fib42(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 51 | data class Fib43(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 52 | data class Fib44(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 53 | data class Fib45(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 54 | data class Fib46(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 55 | data class Fib47(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 56 | data class Fib48(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 57 | data class Fib49(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 58 | data class Fib50(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 59 | data class Fib51(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 60 | data class Fib52(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 61 | data class Fib53(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 62 | data class Fib54(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 63 | data class Fib55(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 64 | data class Fib56(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 65 | data class Fib57(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 66 | data class Fib58(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 67 | data class Fib59(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 68 | data class Fib60(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 69 | data class Fib61(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 70 | data class Fib62(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 71 | data class Fib63(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 72 | data class Fib64(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 73 | data class Fib65(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 74 | data class Fib66(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 75 | data class Fib67(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 76 | data class Fib68(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 77 | data class Fib69(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 78 | data class Fib70(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 79 | data class Fib71(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 80 | data class Fib72(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 81 | data class Fib73(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 82 | data class Fib74(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 83 | data class Fib75(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 84 | data class Fib76(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 85 | data class Fib77(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 86 | data class Fib78(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 87 | data class Fib79(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 88 | data class Fib80(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 89 | data class Fib81(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 90 | data class Fib82(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 91 | data class Fib83(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 92 | data class Fib84(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 93 | data class Fib85(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 94 | data class Fib86(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 95 | data class Fib87(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 96 | data class Fib88(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 97 | data class Fib89(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 98 | data class Fib90(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 99 | data class Fib91(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 100 | data class Fib92(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 101 | data class Fib93(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 102 | data class Fib94(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 103 | data class Fib95(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 104 | data class Fib96(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 105 | data class Fib97(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 106 | data class Fib98(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 107 | data class Fib99(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 108 | data class Fib100(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 109 | data class Fib101(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 110 | data class Fib102(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 111 | data class Fib103(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 112 | data class Fib104(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 113 | data class Fib105(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 114 | data class Fib106(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 115 | data class Fib107(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 116 | data class Fib108(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 117 | data class Fib109(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 118 | data class Fib110(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 119 | data class Fib111(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 120 | data class Fib112(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 121 | data class Fib113(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 122 | data class Fib114(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 123 | data class Fib115(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 124 | data class Fib116(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 125 | data class Fib117(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 126 | data class Fib118(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 127 | data class Fib119(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 128 | data class Fib120(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 129 | data class Fib121(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 130 | data class Fib122(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 131 | data class Fib123(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 132 | data class Fib124(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 133 | data class Fib125(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 134 | data class Fib126(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 135 | data class Fib127(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 136 | data class Fib128(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 137 | data class Fib129(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 138 | data class Fib130(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 139 | data class Fib131(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 140 | data class Fib132(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 141 | data class Fib133(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 142 | data class Fib134(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 143 | data class Fib135(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 144 | data class Fib136(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 145 | data class Fib137(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 146 | data class Fib138(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 147 | data class Fib139(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 148 | data class Fib140(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 149 | data class Fib141(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 150 | data class Fib142(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 151 | data class Fib143(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 152 | data class Fib144(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 153 | data class Fib145(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 154 | data class Fib146(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 155 | data class Fib147(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 156 | data class Fib148(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 157 | data class Fib149(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 158 | data class Fib150(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 159 | data class Fib151(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 160 | data class Fib152(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 161 | data class Fib153(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 162 | data class Fib154(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 163 | data class Fib155(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 164 | data class Fib156(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 165 | data class Fib157(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 166 | data class Fib158(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 167 | data class Fib159(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 168 | data class Fib160(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 169 | data class Fib161(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 170 | data class Fib162(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 171 | data class Fib163(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 172 | data class Fib164(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 173 | data class Fib165(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 174 | data class Fib166(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 175 | data class Fib167(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 176 | data class Fib168(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 177 | data class Fib169(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 178 | data class Fib170(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 179 | data class Fib171(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 180 | data class Fib172(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 181 | data class Fib173(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 182 | data class Fib174(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 183 | data class Fib175(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 184 | data class Fib176(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 185 | data class Fib177(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 186 | data class Fib178(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 187 | data class Fib179(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 188 | data class Fib180(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 189 | data class Fib181(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 190 | data class Fib182(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 191 | data class Fib183(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 192 | data class Fib184(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 193 | data class Fib185(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 194 | data class Fib186(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 195 | data class Fib187(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 196 | data class Fib188(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 197 | data class Fib189(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 198 | data class Fib190(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 199 | data class Fib191(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 200 | data class Fib192(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 201 | data class Fib193(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 202 | data class Fib194(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 203 | data class Fib195(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 204 | data class Fib196(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 205 | data class Fib197(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 206 | data class Fib198(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 207 | data class Fib199(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 208 | data class Fib200(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 209 | data class Fib201(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 210 | data class Fib202(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 211 | data class Fib203(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 212 | data class Fib204(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 213 | data class Fib205(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 214 | data class Fib206(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 215 | data class Fib207(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 216 | data class Fib208(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 217 | data class Fib209(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 218 | data class Fib210(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 219 | data class Fib211(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 220 | data class Fib212(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 221 | data class Fib213(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 222 | data class Fib214(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 223 | data class Fib215(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 224 | data class Fib216(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 225 | data class Fib217(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 226 | data class Fib218(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 227 | data class Fib219(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 228 | data class Fib220(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 229 | data class Fib221(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 230 | data class Fib222(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 231 | data class Fib223(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 232 | data class Fib224(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 233 | data class Fib225(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 234 | data class Fib226(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 235 | data class Fib227(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 236 | data class Fib228(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 237 | data class Fib229(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 238 | data class Fib230(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 239 | data class Fib231(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 240 | data class Fib232(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 241 | data class Fib233(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 242 | data class Fib234(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 243 | data class Fib235(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 244 | data class Fib236(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 245 | data class Fib237(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 246 | data class Fib238(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 247 | data class Fib239(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 248 | data class Fib240(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 249 | data class Fib241(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 250 | data class Fib242(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 251 | data class Fib243(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 252 | data class Fib244(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 253 | data class Fib245(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 254 | data class Fib246(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 255 | data class Fib247(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 256 | data class Fib248(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 257 | data class Fib249(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 258 | data class Fib250(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 259 | data class Fib251(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 260 | data class Fib252(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 261 | data class Fib253(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 262 | data class Fib254(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 263 | data class Fib255(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 264 | data class Fib256(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 265 | data class Fib257(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 266 | data class Fib258(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 267 | data class Fib259(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 268 | data class Fib260(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 269 | data class Fib261(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 270 | data class Fib262(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 271 | data class Fib263(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 272 | data class Fib264(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 273 | data class Fib265(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 274 | data class Fib266(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 275 | data class Fib267(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 276 | data class Fib268(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 277 | data class Fib269(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 278 | data class Fib270(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 279 | data class Fib271(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 280 | data class Fib272(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 281 | data class Fib273(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 282 | data class Fib274(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 283 | data class Fib275(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 284 | data class Fib276(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 285 | data class Fib277(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 286 | data class Fib278(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 287 | data class Fib279(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 288 | data class Fib280(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 289 | data class Fib281(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 290 | data class Fib282(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 291 | data class Fib283(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 292 | data class Fib284(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 293 | data class Fib285(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 294 | data class Fib286(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 295 | data class Fib287(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 296 | data class Fib288(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 297 | data class Fib289(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 298 | data class Fib290(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 299 | data class Fib291(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 300 | data class Fib292(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 301 | data class Fib293(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 302 | data class Fib294(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 303 | data class Fib295(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 304 | data class Fib296(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 305 | data class Fib297(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 306 | data class Fib298(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 307 | data class Fib299(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 308 | data class Fib300(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 309 | data class Fib301(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 310 | data class Fib302(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 311 | data class Fib303(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 312 | data class Fib304(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 313 | data class Fib305(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 314 | data class Fib306(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 315 | data class Fib307(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 316 | data class Fib308(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 317 | data class Fib309(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 318 | data class Fib310(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 319 | data class Fib311(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 320 | data class Fib312(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 321 | data class Fib313(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 322 | data class Fib314(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 323 | data class Fib315(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 324 | data class Fib316(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 325 | data class Fib317(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 326 | data class Fib318(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 327 | data class Fib319(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 328 | data class Fib320(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 329 | data class Fib321(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 330 | data class Fib322(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 331 | data class Fib323(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 332 | data class Fib324(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 333 | data class Fib325(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 334 | data class Fib326(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 335 | data class Fib327(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 336 | data class Fib328(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 337 | data class Fib329(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 338 | data class Fib330(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 339 | data class Fib331(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 340 | data class Fib332(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 341 | data class Fib333(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 342 | data class Fib334(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 343 | data class Fib335(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 344 | data class Fib336(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 345 | data class Fib337(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 346 | data class Fib338(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 347 | data class Fib339(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 348 | data class Fib340(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 349 | data class Fib341(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 350 | data class Fib342(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 351 | data class Fib343(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 352 | data class Fib344(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 353 | data class Fib345(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 354 | data class Fib346(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 355 | data class Fib347(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 356 | data class Fib348(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 357 | data class Fib349(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 358 | data class Fib350(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 359 | data class Fib351(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 360 | data class Fib352(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 361 | data class Fib353(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 362 | data class Fib354(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 363 | data class Fib355(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 364 | data class Fib356(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 365 | data class Fib357(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 366 | data class Fib358(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 367 | data class Fib359(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 368 | data class Fib360(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 369 | data class Fib361(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 370 | data class Fib362(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 371 | data class Fib363(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 372 | data class Fib364(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 373 | data class Fib365(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 374 | data class Fib366(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 375 | data class Fib367(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 376 | data class Fib368(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 377 | data class Fib369(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 378 | data class Fib370(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 379 | data class Fib371(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 380 | data class Fib372(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 381 | data class Fib373(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 382 | data class Fib374(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 383 | data class Fib375(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 384 | data class Fib376(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 385 | data class Fib377(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 386 | data class Fib378(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 387 | data class Fib379(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 388 | data class Fib380(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 389 | data class Fib381(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 390 | data class Fib382(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 391 | data class Fib383(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 392 | data class Fib384(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 393 | data class Fib385(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 394 | data class Fib386(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 395 | data class Fib387(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 396 | data class Fib388(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 397 | data class Fib389(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 398 | data class Fib390(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 399 | data class Fib391(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 400 | data class Fib392(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 401 | data class Fib393(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 402 | data class Fib394(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 403 | data class Fib395(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 404 | data class Fib396(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 405 | data class Fib397(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 406 | data class Fib398(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 407 | data class Fib399(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 408 | data class Fib400(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 409 | data class Fib401(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 410 | data class Fib402(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 411 | data class Fib403(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 412 | data class Fib404(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 413 | data class Fib405(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 414 | data class Fib406(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 415 | data class Fib407(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 416 | data class Fib408(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 417 | data class Fib409(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 418 | data class Fib410(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 419 | data class Fib411(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 420 | data class Fib412(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 421 | data class Fib413(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 422 | data class Fib414(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 423 | data class Fib415(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 424 | data class Fib416(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 425 | data class Fib417(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 426 | data class Fib418(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 427 | data class Fib419(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 428 | data class Fib420(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 429 | data class Fib421(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 430 | data class Fib422(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 431 | data class Fib423(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 432 | data class Fib424(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 433 | data class Fib425(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 434 | data class Fib426(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 435 | data class Fib427(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 436 | data class Fib428(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 437 | data class Fib429(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 438 | data class Fib430(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 439 | data class Fib431(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 440 | data class Fib432(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 441 | data class Fib433(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 442 | data class Fib434(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 443 | data class Fib435(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 444 | data class Fib436(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 445 | data class Fib437(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 446 | data class Fib438(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 447 | data class Fib439(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 448 | data class Fib440(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 449 | data class Fib441(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 450 | data class Fib442(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 451 | data class Fib443(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 452 | data class Fib444(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 453 | data class Fib445(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 454 | data class Fib446(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 455 | data class Fib447(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 456 | data class Fib448(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 457 | data class Fib449(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 458 | data class Fib450(override val fib: Fib? = null, override val fiba: Fib? = null): Fib 459 | --------------------------------------------------------------------------------