diff --git a/library/keccak/api/keccak.api b/library/keccak/api/keccak.api
index f0b4b8f..a239dbf 100644
--- a/library/keccak/api/keccak.api
+++ b/library/keccak/api/keccak.api
@@ -2,8 +2,13 @@ public final class org/kotlincrypto/sponges/keccak/F1600 : org/kotlincrypto/spon
 	public fun <init> ()V
 	public fun addData (IJ)V
 	public synthetic fun addData (ILjava/lang/Number;)V
+	public fun contains (J)Z
+	public fun containsAll (Ljava/util/Collection;)Z
 	public fun copy ()Lorg/kotlincrypto/sponges/keccak/F1600;
 	public synthetic fun copy ()Lorg/kotlincrypto/sponges/keccak/State;
+	public fun get (I)Ljava/lang/Long;
+	public synthetic fun get (I)Ljava/lang/Number;
+	public fun iterator ()Ljava/util/Iterator;
 	public fun reset ()V
 }
 
@@ -11,8 +16,13 @@ public final class org/kotlincrypto/sponges/keccak/F200 : org/kotlincrypto/spong
 	public fun <init> ()V
 	public fun addData (IB)V
 	public synthetic fun addData (ILjava/lang/Number;)V
+	public fun contains (B)Z
+	public fun containsAll (Ljava/util/Collection;)Z
 	public fun copy ()Lorg/kotlincrypto/sponges/keccak/F200;
 	public synthetic fun copy ()Lorg/kotlincrypto/sponges/keccak/State;
+	public fun get (I)Ljava/lang/Byte;
+	public synthetic fun get (I)Ljava/lang/Number;
+	public fun iterator ()Ljava/util/Iterator;
 	public fun reset ()V
 }
 
@@ -20,8 +30,13 @@ public final class org/kotlincrypto/sponges/keccak/F400 : org/kotlincrypto/spong
 	public fun <init> ()V
 	public synthetic fun addData (ILjava/lang/Number;)V
 	public fun addData (IS)V
+	public fun contains (S)Z
+	public fun containsAll (Ljava/util/Collection;)Z
 	public fun copy ()Lorg/kotlincrypto/sponges/keccak/F400;
 	public synthetic fun copy ()Lorg/kotlincrypto/sponges/keccak/State;
+	public synthetic fun get (I)Ljava/lang/Number;
+	public fun get (I)Ljava/lang/Short;
+	public fun iterator ()Ljava/util/Iterator;
 	public fun reset ()V
 }
 
@@ -29,8 +44,13 @@ public final class org/kotlincrypto/sponges/keccak/F800 : org/kotlincrypto/spong
 	public fun <init> ()V
 	public fun addData (II)V
 	public synthetic fun addData (ILjava/lang/Number;)V
+	public fun contains (I)Z
+	public fun containsAll (Ljava/util/Collection;)Z
 	public fun copy ()Lorg/kotlincrypto/sponges/keccak/F800;
 	public synthetic fun copy ()Lorg/kotlincrypto/sponges/keccak/State;
+	public fun get (I)Ljava/lang/Integer;
+	public synthetic fun get (I)Ljava/lang/Number;
+	public fun iterator ()Ljava/util/Iterator;
 	public fun reset ()V
 }
 
@@ -54,22 +74,20 @@ public final class org/kotlincrypto/sponges/keccak/KeccakPKt {
 
 public abstract class org/kotlincrypto/sponges/keccak/State : java/util/Collection, kotlin/jvm/internal/markers/KMappedMarker {
 	protected static final field Companion Lorg/kotlincrypto/sponges/keccak/State$Companion;
-	protected final field array [Ljava/lang/Number;
 	public final field roundCount B
-	public synthetic fun <init> (B[Ljava/lang/Number;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
+	public synthetic fun <init> (BLkotlin/jvm/internal/DefaultConstructorMarker;)V
 	public fun add (Ljava/lang/Number;)Z
 	public synthetic fun add (Ljava/lang/Object;)Z
 	public fun addAll (Ljava/util/Collection;)Z
 	public abstract fun addData (ILjava/lang/Number;)V
 	public fun clear ()V
-	public final fun contains (Ljava/lang/Number;)Z
+	public abstract fun contains (Ljava/lang/Number;)Z
 	public final fun contains (Ljava/lang/Object;)Z
-	public final fun containsAll (Ljava/util/Collection;)Z
 	public abstract fun copy ()Lorg/kotlincrypto/sponges/keccak/State;
-	public final fun get (I)Ljava/lang/Number;
+	public abstract fun get (I)Ljava/lang/Number;
 	public final fun getSize ()I
 	public final fun isEmpty ()Z
-	public final fun iterator ()Ljava/util/Iterator;
+	public fun iterator ()Ljava/util/Iterator;
 	public fun remove (Ljava/lang/Object;)Z
 	public fun removeAll (Ljava/util/Collection;)Z
 	public fun removeIf (Ljava/util/function/Predicate;)Z
diff --git a/library/keccak/api/keccak.klib.api b/library/keccak/api/keccak.klib.api
index 49f6142..74e43c4 100644
--- a/library/keccak/api/keccak.klib.api
+++ b/library/keccak/api/keccak.klib.api
@@ -10,7 +10,11 @@ final class org.kotlincrypto.sponges.keccak/F1600 : org.kotlincrypto.sponges.kec
     constructor <init>() // org.kotlincrypto.sponges.keccak/F1600.<init>|<init>(){}[0]
 
     final fun addData(kotlin/Int, kotlin/Long) // org.kotlincrypto.sponges.keccak/F1600.addData|addData(kotlin.Int;kotlin.Long){}[0]
+    final fun contains(kotlin/Long): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F1600.contains|contains(kotlin.Long){}[0]
+    final fun containsAll(kotlin.collections/Collection<kotlin/Long>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F1600.containsAll|containsAll(kotlin.collections.Collection<kotlin.Long>){}[0]
     final fun copy(): org.kotlincrypto.sponges.keccak/F1600 // org.kotlincrypto.sponges.keccak/F1600.copy|copy(){}[0]
+    final fun get(kotlin/Int): kotlin/Long // org.kotlincrypto.sponges.keccak/F1600.get|get(kotlin.Int){}[0]
+    final fun iterator(): kotlin.collections/Iterator<kotlin/Long> // org.kotlincrypto.sponges.keccak/F1600.iterator|iterator(){}[0]
     final fun reset() // org.kotlincrypto.sponges.keccak/F1600.reset|reset(){}[0]
 }
 
@@ -18,7 +22,11 @@ final class org.kotlincrypto.sponges.keccak/F200 : org.kotlincrypto.sponges.kecc
     constructor <init>() // org.kotlincrypto.sponges.keccak/F200.<init>|<init>(){}[0]
 
     final fun addData(kotlin/Int, kotlin/Byte) // org.kotlincrypto.sponges.keccak/F200.addData|addData(kotlin.Int;kotlin.Byte){}[0]
+    final fun contains(kotlin/Byte): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F200.contains|contains(kotlin.Byte){}[0]
+    final fun containsAll(kotlin.collections/Collection<kotlin/Byte>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F200.containsAll|containsAll(kotlin.collections.Collection<kotlin.Byte>){}[0]
     final fun copy(): org.kotlincrypto.sponges.keccak/F200 // org.kotlincrypto.sponges.keccak/F200.copy|copy(){}[0]
+    final fun get(kotlin/Int): kotlin/Byte // org.kotlincrypto.sponges.keccak/F200.get|get(kotlin.Int){}[0]
+    final fun iterator(): kotlin.collections/Iterator<kotlin/Byte> // org.kotlincrypto.sponges.keccak/F200.iterator|iterator(){}[0]
     final fun reset() // org.kotlincrypto.sponges.keccak/F200.reset|reset(){}[0]
 }
 
@@ -26,7 +34,11 @@ final class org.kotlincrypto.sponges.keccak/F400 : org.kotlincrypto.sponges.kecc
     constructor <init>() // org.kotlincrypto.sponges.keccak/F400.<init>|<init>(){}[0]
 
     final fun addData(kotlin/Int, kotlin/Short) // org.kotlincrypto.sponges.keccak/F400.addData|addData(kotlin.Int;kotlin.Short){}[0]
+    final fun contains(kotlin/Short): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F400.contains|contains(kotlin.Short){}[0]
+    final fun containsAll(kotlin.collections/Collection<kotlin/Short>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F400.containsAll|containsAll(kotlin.collections.Collection<kotlin.Short>){}[0]
     final fun copy(): org.kotlincrypto.sponges.keccak/F400 // org.kotlincrypto.sponges.keccak/F400.copy|copy(){}[0]
+    final fun get(kotlin/Int): kotlin/Short // org.kotlincrypto.sponges.keccak/F400.get|get(kotlin.Int){}[0]
+    final fun iterator(): kotlin.collections/Iterator<kotlin/Short> // org.kotlincrypto.sponges.keccak/F400.iterator|iterator(){}[0]
     final fun reset() // org.kotlincrypto.sponges.keccak/F400.reset|reset(){}[0]
 }
 
@@ -34,15 +46,17 @@ final class org.kotlincrypto.sponges.keccak/F800 : org.kotlincrypto.sponges.kecc
     constructor <init>() // org.kotlincrypto.sponges.keccak/F800.<init>|<init>(){}[0]
 
     final fun addData(kotlin/Int, kotlin/Int) // org.kotlincrypto.sponges.keccak/F800.addData|addData(kotlin.Int;kotlin.Int){}[0]
+    final fun contains(kotlin/Int): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F800.contains|contains(kotlin.Int){}[0]
+    final fun containsAll(kotlin.collections/Collection<kotlin/Int>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/F800.containsAll|containsAll(kotlin.collections.Collection<kotlin.Int>){}[0]
     final fun copy(): org.kotlincrypto.sponges.keccak/F800 // org.kotlincrypto.sponges.keccak/F800.copy|copy(){}[0]
+    final fun get(kotlin/Int): kotlin/Int // org.kotlincrypto.sponges.keccak/F800.get|get(kotlin.Int){}[0]
+    final fun iterator(): kotlin.collections/Iterator<kotlin/Int> // org.kotlincrypto.sponges.keccak/F800.iterator|iterator(){}[0]
     final fun reset() // org.kotlincrypto.sponges.keccak/F800.reset|reset(){}[0]
 }
 
 sealed class <#A: kotlin/Number, #B: org.kotlincrypto.sponges.keccak/State<#A, #B>> org.kotlincrypto.sponges.keccak/State : kotlin.collections/Collection<#A> { // org.kotlincrypto.sponges.keccak/State|null[0]
-    constructor <init>(kotlin/Byte, kotlin/Array<#A>) // org.kotlincrypto.sponges.keccak/State.<init>|<init>(kotlin.Byte;kotlin.Array<1:0>){}[0]
+    constructor <init>(kotlin/Byte) // org.kotlincrypto.sponges.keccak/State.<init>|<init>(kotlin.Byte){}[0]
 
-    final val array // org.kotlincrypto.sponges.keccak/State.array|{}array[0]
-        final fun <get-array>(): kotlin/Array<#A> // org.kotlincrypto.sponges.keccak/State.array.<get-array>|<get-array>(){}[0]
     final val roundCount // org.kotlincrypto.sponges.keccak/State.roundCount|{}roundCount[0]
         final fun <get-roundCount>(): kotlin/Byte // org.kotlincrypto.sponges.keccak/State.roundCount.<get-roundCount>|<get-roundCount>(){}[0]
     final val size // org.kotlincrypto.sponges.keccak/State.size|{}size[0]
@@ -50,12 +64,9 @@ sealed class <#A: kotlin/Number, #B: org.kotlincrypto.sponges.keccak/State<#A, #
 
     abstract fun addData(kotlin/Int, #A) // org.kotlincrypto.sponges.keccak/State.addData|addData(kotlin.Int;1:0){}[0]
     abstract fun copy(): #B // org.kotlincrypto.sponges.keccak/State.copy|copy(){}[0]
+    abstract fun get(kotlin/Int): #A // org.kotlincrypto.sponges.keccak/State.get|get(kotlin.Int){}[0]
     abstract fun reset() // org.kotlincrypto.sponges.keccak/State.reset|reset(){}[0]
-    final fun contains(#A): kotlin/Boolean // org.kotlincrypto.sponges.keccak/State.contains|contains(1:0){}[0]
-    final fun containsAll(kotlin.collections/Collection<#A>): kotlin/Boolean // org.kotlincrypto.sponges.keccak/State.containsAll|containsAll(kotlin.collections.Collection<1:0>){}[0]
-    final fun get(kotlin/Int): #A // org.kotlincrypto.sponges.keccak/State.get|get(kotlin.Int){}[0]
     final fun isEmpty(): kotlin/Boolean // org.kotlincrypto.sponges.keccak/State.isEmpty|isEmpty(){}[0]
-    final fun iterator(): kotlin.collections/Iterator<#A> // org.kotlincrypto.sponges.keccak/State.iterator|iterator(){}[0]
 
     final object Companion // org.kotlincrypto.sponges.keccak/State.Companion|null[0]
 }
diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F1600.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F1600.kt
index 57c75b9..dbe8329 100644
--- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F1600.kt
+++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F1600.kt
@@ -15,16 +15,39 @@
  **/
 package org.kotlincrypto.sponges.keccak
 
+import kotlin.jvm.JvmSynthetic
+
 /**
  * [State] for Keccak-f[1600]
  *
  * @see [keccakP]
  * */
 public class F1600: State<Long, F1600> {
-    public constructor(): super(roundCount = 24, array = Array(P_LEN) { 0 })
-    private constructor(state: F1600): super(state.roundCount, state.array.copyOf())
-    public override fun copy(): F1600 = F1600(this)
+
+    @get:JvmSynthetic
+    internal val array: LongArray
+
+    public constructor(): super(roundCount = 24) {
+        array = LongArray(P_LEN) { 0 }
+    }
+    private constructor(state: F1600): super(state.roundCount) {
+        array = state.array.copyOf()
+    }
+
+    @Throws(IndexOutOfBoundsException::class)
+    public override operator fun get(index: Int): Long = array[index]
+
     @Throws(IndexOutOfBoundsException::class)
     public override fun addData(index: Int, data: Long) { array[index] = array[index] xor data }
+    public override fun copy(): F1600 = F1600(this)
     public override fun reset() { array.fill(0) }
+
+    public override fun iterator(): Iterator<Long> = array.iterator()
+    public override fun contains(element: Long): Boolean = array.contains(element)
+    public override fun containsAll(elements: Collection<Long>): Boolean {
+        elements.forEach { n ->
+            if (!array.contains(n)) return false
+        }
+        return true
+    }
 }
diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F200.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F200.kt
index 9eeafe8..db2411f 100644
--- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F200.kt
+++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F200.kt
@@ -16,6 +16,7 @@
 package org.kotlincrypto.sponges.keccak
 
 import kotlin.experimental.xor
+import kotlin.jvm.JvmSynthetic
 
 /**
  * [State] for Keccak-f[200]
@@ -23,10 +24,31 @@ import kotlin.experimental.xor
  * @see [keccakP]
  * */
 public class F200: State<Byte, F200> {
-    public constructor(): super(roundCount = 18, array = Array(P_LEN) { 0 })
-    private constructor(state: F200): super(state.roundCount, state.array.copyOf())
-    public override fun copy(): F200 = F200(this)
+
+    @get:JvmSynthetic
+    internal val array: ByteArray
+
+    public constructor(): super(roundCount = 18) {
+        array = ByteArray(P_LEN) { 0 }
+    }
+    private constructor(state: F200): super(state.roundCount) {
+        array = state.array.copyOf()
+    }
+
+    @Throws(IndexOutOfBoundsException::class)
+    public override operator fun get(index: Int): Byte = array[index]
+
     @Throws(IndexOutOfBoundsException::class)
     public override fun addData(index: Int, data: Byte) { array[index] = array[index] xor data }
+    public override fun copy(): F200 = F200(this)
     public override fun reset() { array.fill(0) }
+
+    public override fun iterator(): Iterator<Byte> = array.iterator()
+    public override fun contains(element: Byte): Boolean = array.contains(element)
+    public override fun containsAll(elements: Collection<Byte>): Boolean {
+        elements.forEach { n ->
+            if (!array.contains(n)) return false
+        }
+        return true
+    }
 }
diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F400.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F400.kt
index 3803ccb..d80dc45 100644
--- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F400.kt
+++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F400.kt
@@ -16,6 +16,7 @@
 package org.kotlincrypto.sponges.keccak
 
 import kotlin.experimental.xor
+import kotlin.jvm.JvmSynthetic
 
 /**
  * [State] for Keccak-f[400]
@@ -23,10 +24,31 @@ import kotlin.experimental.xor
  * @see [keccakP]
  * */
 public class F400: State<Short, F400> {
-    public constructor(): super(roundCount = 20, array = Array(P_LEN) { 0 })
-    private constructor(state: F400): super(state.roundCount, state.array.copyOf())
-    public override fun copy(): F400 = F400(this)
+
+    @get:JvmSynthetic
+    internal val array: ShortArray
+
+    public constructor(): super(roundCount = 20) {
+        array = ShortArray(P_LEN) { 0 }
+    }
+    private constructor(state: F400): super(state.roundCount) {
+        array = state.array.copyOf()
+    }
+
+    @Throws(IndexOutOfBoundsException::class)
+    public override operator fun get(index: Int): Short = array[index]
+
     @Throws(IndexOutOfBoundsException::class)
     public override fun addData(index: Int, data: Short) { array[index] = array[index] xor data }
+    public override fun copy(): F400 = F400(this)
     public override fun reset() { array.fill(0) }
+
+    public override fun iterator(): Iterator<Short> = array.iterator()
+    public override fun contains(element: Short): Boolean = array.contains(element)
+    public override fun containsAll(elements: Collection<Short>): Boolean {
+        elements.forEach { n ->
+            if (!array.contains(n)) return false
+        }
+        return true
+    }
 }
diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F800.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F800.kt
index 5f610d6..0fe3d75 100644
--- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F800.kt
+++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/F800.kt
@@ -15,6 +15,8 @@
  **/
 package org.kotlincrypto.sponges.keccak
 
+import kotlin.jvm.JvmSynthetic
+
 
 /**
  * [State] for Keccak-f[800]
@@ -22,10 +24,31 @@ package org.kotlincrypto.sponges.keccak
  * @see [keccakP]
  * */
 public class F800: State<Int, F800> {
-    public constructor(): super(roundCount = 22, array = Array(P_LEN) { 0 })
-    private constructor(state: F800): super(state.roundCount, state.array.copyOf())
-    public override fun copy(): F800 = F800(this)
+
+    @get:JvmSynthetic
+    internal val array: IntArray
+
+    public constructor(): super(roundCount = 22) {
+        array = IntArray(P_LEN) { 0 }
+    }
+    private constructor(state: F800): super(state.roundCount) {
+        array = state.array.copyOf()
+    }
+
+    @Throws(IndexOutOfBoundsException::class)
+    public override operator fun get(index: Int): Int = array[index]
+
     @Throws(IndexOutOfBoundsException::class)
     public override fun addData(index: Int, data: Int) { array[index] = array[index] xor data }
+    public override fun copy(): F800 = F800(this)
     public override fun reset() { array.fill(0) }
+
+    public override fun iterator(): Iterator<Int> = array.iterator()
+    public override fun contains(element: Int): Boolean = array.contains(element)
+    public override fun containsAll(elements: Collection<Int>): Boolean {
+        elements.forEach { n ->
+            if (!array.contains(n)) return false
+        }
+        return true
+    }
 }
diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/KeccakP.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/KeccakP.kt
index 8ef1366..2e681c4 100644
--- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/KeccakP.kt
+++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/KeccakP.kt
@@ -51,7 +51,7 @@ private val RC = longArrayOf(
 @Throws(IllegalArgumentException::class)
 public fun F1600.keccakP(rounds: Byte = roundCount) {
     checkRounds(rounds) ?: return
-    val A = lanes()
+    val A = array
 
     var a00 = A[ 0]; var a01 = A[ 1]; var a02 = A[ 2]; var a03 = A[ 3]; var a04 = A[ 4]
     var a05 = A[ 5]; var a06 = A[ 6]; var a07 = A[ 7]; var a08 = A[ 8]; var a09 = A[ 9]
@@ -187,7 +187,7 @@ public fun F1600.keccakP(rounds: Byte = roundCount) {
 @Throws(IllegalArgumentException::class)
 public fun F800.keccakP(rounds: Byte = roundCount) {
     checkRounds(rounds) ?: return
-    val A = lanes()
+    val A = array
 
     var a00 = A[ 0]; var a01 = A[ 1]; var a02 = A[ 2]; var a03 = A[ 3]; var a04 = A[ 4]
     var a05 = A[ 5]; var a06 = A[ 6]; var a07 = A[ 7]; var a08 = A[ 8]; var a09 = A[ 9]
@@ -323,7 +323,7 @@ public fun F800.keccakP(rounds: Byte = roundCount) {
 @Throws(IllegalArgumentException::class)
 public fun F400.keccakP(rounds: Byte = roundCount) {
     checkRounds(rounds) ?: return
-    val A = lanes()
+    val A = array
 
     var a00 = A[ 0]; var a01 = A[ 1]; var a02 = A[ 2]; var a03 = A[ 3]; var a04 = A[ 4]
     var a05 = A[ 5]; var a06 = A[ 6]; var a07 = A[ 7]; var a08 = A[ 8]; var a09 = A[ 9]
@@ -459,7 +459,7 @@ public fun F400.keccakP(rounds: Byte = roundCount) {
 @Throws(IllegalArgumentException::class)
 public fun F200.keccakP(rounds: Byte = roundCount) {
     checkRounds(rounds) ?: return
-    val A = lanes()
+    val A = array
 
     var a00 = A[ 0]; var a01 = A[ 1]; var a02 = A[ 2]; var a03 = A[ 3]; var a04 = A[ 4]
     var a05 = A[ 5]; var a06 = A[ 6]; var a07 = A[ 7]; var a08 = A[ 8]; var a09 = A[ 9]
diff --git a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/State.kt b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/State.kt
index 573c721..ca0a3de 100644
--- a/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/State.kt
+++ b/library/keccak/src/commonMain/kotlin/org/kotlincrypto/sponges/keccak/State.kt
@@ -18,7 +18,6 @@
 package org.kotlincrypto.sponges.keccak
 
 import kotlin.jvm.JvmField
-import kotlin.jvm.JvmSynthetic
 
 /**
  * Core abstraction for Keccak-p[b, nr] state, or "lanes".
@@ -36,18 +35,10 @@ public sealed class State<N: Number, T: State<N, T>>(
      * */
     @JvmField
     public val roundCount: Byte,
-
-    @JvmField
-    protected val array: Array<N>,
 ): Collection<N> {
 
-    init {
-        // state.size will always be 25
-        require(array.size == P_LEN) { "state.size must equal $P_LEN" }
-    }
-
     @Throws(IndexOutOfBoundsException::class)
-    public operator fun get(index: Int): N = array[index]
+    public abstract operator fun get(index: Int): N
 
     /**
      * Adds [data] to [data] at the provided [index]
@@ -63,27 +54,6 @@ public sealed class State<N: Number, T: State<N, T>>(
 
     final override val size: Int get() = P_LEN
     final override fun isEmpty(): Boolean = false
-    final override operator fun contains(element: N): Boolean = array.contains(element)
-    final override fun iterator(): Iterator<N> = object : Iterator<N> {
-        private val delegate = array.iterator()
-
-        override fun hasNext(): Boolean = delegate.hasNext()
-        override fun next(): N = delegate.next()
-
-        override fun equals(other: Any?): Boolean = delegate == other
-        override fun hashCode(): Int = delegate.hashCode()
-        override fun toString(): String = delegate.toString()
-    }
-    final override fun containsAll(elements: Collection<N>): Boolean {
-        elements.forEach { n ->
-            if (!array.contains(n)) return false
-        }
-
-        return true
-    }
-
-    @JvmSynthetic
-    internal fun lanes(): Array<N> = array
 
     protected companion object {
         internal const val P_LEN: Int = 25