package com.bitmovin.player.reactnative.extensions fun Map.getBooleanOrNull(key: String): Boolean? = get(key) as? Boolean fun Map.getIntOrNull(key: String): Int? = (get(key) as? Number)?.toInt() fun Map.getInt(key: String): Int = (get(key) as? Number)?.toInt() ?: 0 fun Map.getDoubleOrNull(key: String): Double? = (get(key) as? Number)?.toDouble() fun Map.getString(key: String): String? = get(key) as? String fun Map.getMap(key: String): Map? = get(key) as? Map fun Map.getArray(key: String): List? = get(key) as? List inline fun Map.withDouble( key: String, block: (Double) -> T, ): T? { val value = (get(key) as? Number)?.toDouble() return if (value != null) block(value) else null } inline fun Map.withMap( key: String, block: (Map) -> T, ): T? { val value = get(key) as? Map return if (value != null) block(value) else null } inline fun Map.withInt( key: String, block: (Int) -> T, ): T? { val value = (get(key) as? Number)?.toInt() return if (value != null) block(value) else null } inline fun Map.withBoolean( key: String, block: (Boolean) -> T, ): T? { val value = get(key) as? Boolean return if (value != null) block(value) else null } inline fun Map.withString( key: String, block: (String) -> T, ): T? { val value = get(key) as? String return if (value != null) block(value) else null } inline fun Map.withArray( key: String, block: (List) -> T, ): T? { val value = get(key) as? List return if (value != null) block(value) else null } inline fun Map.withStringArray( key: String, block: (List) -> T, ): T? { val value = (get(key) as? List<*>)?.map { item -> item as? String } return if (value != null) block(value) else null } fun Map.getStringArray(key: String): List? = (get(key) as? List<*>)?.map { it as? String } inline fun Map.mapValue( key: String, transform: (Any?) -> R?, ): R? = if (containsKey(key)) transform(get(key)) else null inline fun Map.toMap(): Map = mapValues { it.value as T } /** Convert a [Map] to [Map], adding each [T] value using [put]. */ private inline fun Map.toMap( put: MutableMap.(String, T) -> Unit = { key, value -> this[key] = value }, ): Map = mutableMapOf().apply { forEach { put(it.key, it.value) } } @JvmName("toStringMap") fun Map.toMap(): Map = toMap() fun List.toMapList(): List?> = map { it as? Map } fun List.toStringList(): List = map { it as? String } fun List.toBooleanList(): List = map { it as? Boolean } fun List.toDoubleList(): List = map { (it as? Number)?.toDouble() } fun List.toIntList(): List = map { (it as? Number)?.toInt() } inline fun List.mapToList( transform: (T) -> Map, ): List> = map(transform)