1 /*
<lambda>null2  * Copyright 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.room.migration.bundle
18 
19 /** Utility class to run schema equality on collections. */
20 internal object SchemaEqualityUtil {
21     fun <T, K : SchemaEquality<K>> checkSchemaEquality(
22         map1: Map<T, K>?,
23         map2: Map<T, K>?
24     ): Boolean {
25         return when {
26             map1 == null -> map2 == null
27             map2 == null -> false
28             map1.size != map2.size -> false
29             else -> map1.entries.all { checkSchemaEquality(it.value, map2.get(it.key)) }
30         }
31     }
32 
33     fun <K : SchemaEquality<K>> checkSchemaEquality(list1: List<K>?, list2: List<K>?): Boolean {
34         return when {
35             list1 == null -> list2 == null
36             list2 == null -> false
37             list1.size != list2.size -> false
38             else -> list1.all { item1 -> list2.any { item2 -> checkSchemaEquality(item1, item2) } }
39         }
40     }
41 
42     fun <K : SchemaEquality<K>> checkSchemaEquality(item1: K?, item2: K?): Boolean {
43         return when {
44             item1 == null -> item2 == null
45             item2 == null -> false
46             else -> item1.isSchemaEqual(item2)
47         }
48     }
49 
50     inline fun <K, reified R> Map<K, *>.filterValuesInstance(): Map<K, R> = buildMap {
51         this@filterValuesInstance.forEach { (key, value) -> if (value is R) put(key, value) }
52     }
53 }
54