@file:JvmName("StringUtils") package com.keylesspalace.tusky.util import java.util.Random private const val POSSIBLE_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" fun randomAlphanumericString(count: Int): String { val chars = CharArray(count) val random = Random() for (i in 0 until count) { chars[i] = POSSIBLE_CHARS[random.nextInt(POSSIBLE_CHARS.length)] } return String(chars) } // We sort statuses by ID. Something we need to invent some ID for placeholder. // Not sure if inc()/dec() should be made `operator` or not /** * "Increment" string so that during sorting it's bigger than [this]. */ fun String.inc(): String { // We assume that we will stay in the safe range for now val builder = this.toCharArray() builder[lastIndex] = builder[lastIndex].inc() return String(builder) } /** * "Decrement" string so that during sorting it's smaller than [this]. */ fun String.dec(): String { if (this.isEmpty()) return this val builder = this.toCharArray() var i = builder.lastIndex while (i > 0) { if (builder[i] > '0') { builder[i] = builder[i].dec() return String(builder) } else { builder[i] = 'z' } i-- } return if (builder[0] > '1') { builder[0] = builder[0].dec() String(builder) } else { String(builder.copyOfRange(1, builder.size)) } } /** * A < B (strictly) by length and then by content. * Examples: * "abc" < "bcd" * "ab" < "abc" * "cb" < "abc" * not: "ab" < "ab" * not: "abc" > "cb" */ fun String.isLessThan(other: String): Boolean { return when { this.length < other.length -> true this.length > other.length -> false else -> this < other } }