Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 39 additions & 1 deletion src/main/kotlin/CustomAdt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,48 @@ sealed interface ParseResult {
data class Failure(val pos: Int, val char: Char) : ParseResult
}

fun String.firstNonDigitCharOrNull(): IndexedValue<Char>? =
this
.asSequence()
.withIndex()
.filterNot { isCorrectIntStringChar(it.index, it.value, this.first()) }
.firstOrNull()

fun isCorrectIntStringChar(pos: Int, char: Char, firstChar: Char): Boolean {
val maxLengthOfPositiveIntString = Int.MAX_VALUE.toString().length
return when {
pos == 0 && char == '-' -> true
pos == 1 && char == '0' && firstChar == '-' -> false
pos == 1 && char == '0' && firstChar == '0' -> false
pos < maxLengthOfPositiveIntString && char.isDigit() -> true
pos == maxLengthOfPositiveIntString && char.isDigit() && firstChar == '-' -> true
else -> false
}
}

fun parseCorrectInt(str: String): Int =
when (str.first()) {
'-' -> parseNegativeInt(str)
else -> parsePositiveInt(str)
}

fun parseNegativeInt(str: String): Int =
-1 * parsePositiveInt(str.drop(1))

fun parsePositiveInt(str: String): Int =
str
.map { it - '0' }
.fold(0) { accumulator, digit -> accumulator * 10 + digit }

object CustomAdt {

fun parseInt(str: String): ParseResult {
TODO()
return when {
str.isEmpty() -> ParseResult.Failure(-1, '\u0000')
else -> str.firstNonDigitCharOrNull()
?.let { ParseResult.Failure(it.index, it.value) }
?: ParseResult.Success(parseCorrectInt(str))
}
}

}