diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/exception/MatrixNotRectangularException.kt b/src/main/kotlin/org/duckdns/davygora/matrix/exception/MatrixNotRectangularException.kt new file mode 100644 index 0000000..6f44506 --- /dev/null +++ b/src/main/kotlin/org/duckdns/davygora/matrix/exception/MatrixNotRectangularException.kt @@ -0,0 +1,5 @@ +package org.duckdns.davygora.matrix.exception + +class MatrixNotRectangularException( + xSizes: Collection, +) : MatrixException("Submitted matrix is not rectangular, different row sizes are $xSizes") diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/impl/ArrayMatrix.kt b/src/main/kotlin/org/duckdns/davygora/matrix/impl/ArrayMatrix.kt index 5dc8fe2..87f3b8d 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/impl/ArrayMatrix.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/impl/ArrayMatrix.kt @@ -1,12 +1,12 @@ package org.duckdns.davygora.matrix.impl import org.duckdns.davygora.matrix.AbstractMutableMatrix -import org.duckdns.davygora.matrix.Matrix import org.duckdns.davygora.matrix.exception.MatrixCoordinateOutOfRangeException import org.duckdns.davygora.matrix.exception.MatrixInvalidSizeException import org.duckdns.davygora.matrix.exception.MatrixNotRectangularException import org.duckdns.davygora.matrix.exception.MatrixSizeMismatchException import org.duckdns.davygora.matrix.storage.MatrixStorage +import org.duckdns.davygora.matrix.storage.toMatrixStorage import org.duckdns.davygora.memoize.memoize class ArrayMatrix( @@ -54,4 +54,24 @@ class ArrayMatrix( } else { throw MatrixCoordinateOutOfRangeException(coordName, coord, maxCoord) } + + companion object { + inline fun create(values: List>): ArrayMatrix { + val ySize = values.size + val xSize = + when { + ySize > 0 -> { + values.map { row -> row.size }.toSet().let { xSizes -> + if (xSizes.size == 1) xSizes.first() else throw MatrixNotRectangularException(xSizes) + } + } + + else -> { + 0 + } + } + + return ArrayMatrix(xSize, ySize, values.flatten().toMatrixStorage()) + } + } } diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/BooleanStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/BooleanStorage.kt index 6243d0b..2fcd4e9 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/BooleanStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/BooleanStorage.kt @@ -17,3 +17,5 @@ value class BooleanStorage( override fun toString(): String = data.contentToString() } + +fun BooleanArray.toMatrixStorage() = BooleanStorage(this) diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ByteStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ByteStorage.kt index 21dd502..45488b4 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ByteStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ByteStorage.kt @@ -17,3 +17,5 @@ value class ByteStorage( override fun toString(): String = data.contentToString() } + +fun ByteArray.toMatrixStorage() = ByteStorage(this) diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/CharStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/CharStorage.kt index 52dd8ed..2390306 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/CharStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/CharStorage.kt @@ -17,3 +17,5 @@ value class CharStorage( override fun toString(): String = data.contentToString() } + +fun CharArray.toMatrixStorage() = CharStorage(this) diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/DoubleStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/DoubleStorage.kt index 7ed8d3f..613c044 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/DoubleStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/DoubleStorage.kt @@ -17,3 +17,5 @@ value class DoubleStorage( override fun toString(): String = data.contentToString() } + +fun DoubleArray.toMatrixStorage() = DoubleStorage(this) diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/FloatStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/FloatStorage.kt index bde36c9..6cd73e2 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/FloatStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/FloatStorage.kt @@ -17,3 +17,5 @@ value class FloatStorage( override fun toString(): String = data.contentToString() } + +fun FloatArray.toMatrixStorage() = FloatStorage(this) diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/IntStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/IntStorage.kt index ca3cd7b..1f3c81b 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/IntStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/IntStorage.kt @@ -17,3 +17,5 @@ value class IntStorage( override fun toString(): String = data.contentToString() } + +fun IntArray.toMatrixStorage() = IntStorage(this) diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/LongStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/LongStorage.kt index e1fe2ce..10fee68 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/LongStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/LongStorage.kt @@ -17,3 +17,5 @@ value class LongStorage( override fun toString(): String = data.contentToString() } + +fun LongArray.toMatrixStorage() = LongStorage(this) diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorage.kt index db672aa..2f1fd45 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorage.kt @@ -10,3 +10,17 @@ sealed interface MatrixStorage { value: T, ) } + +@Suppress("UNCHECKED_CAST") +inline fun List.toMatrixStorage() = + when (T::class) { + Boolean::class -> (this as List).toBooleanArray().toMatrixStorage() + Byte::class -> (this as List).toByteArray().toMatrixStorage() + Char::class -> (this as List).toCharArray().toMatrixStorage() + Double::class -> (this as List).toDoubleArray().toMatrixStorage() + Float::class -> (this as List).toFloatArray().toMatrixStorage() + Int::class -> (this as List).toIntArray().toMatrixStorage() + Long::class -> (this as List).toLongArray().toMatrixStorage() + Short::class -> (this as List).toShortArray().toMatrixStorage() + else -> this.toTypedArray().toMatrixStorage() + } as MatrixStorage diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ObjectStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ObjectStorage.kt index 964af74..3b7b66b 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ObjectStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ObjectStorage.kt @@ -17,3 +17,5 @@ value class ObjectStorage( override fun toString(): String = data.contentToString() } + +fun Array.toMatrixStorage() = ObjectStorage(this) diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ShortStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ShortStorage.kt index 9cbf877..a3b0b1b 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ShortStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ShortStorage.kt @@ -17,3 +17,5 @@ value class ShortStorage( override fun toString(): String = data.contentToString() } + +fun ShortArray.toMatrixStorage() = ShortStorage(this)