From 420ba08f11edd7b1f4cd0f6bc0b7bab2c74decb3 Mon Sep 17 00:00:00 2001 From: franciscodr Date: Wed, 13 Jan 2021 14:57:08 +0100 Subject: [PATCH 1/3] Remove extension annotation --- .../extensions/sequence/each/SequenceKEach.kt | 44 +++++++++++++ .../filterIndex/SequenceKFilterIndex.kt | 48 ++++++++++++++ .../sequence/index/SequenceKIndex.kt | 66 +++++++++++++++++++ .../arrow/optics/extensions/sequencek.kt | 4 -- .../sequencek/each/SequenceKEach.kt | 43 ++++++++++++ .../filterIndex/SequenceKFilterIndex.kt | 48 ++++++++++++++ .../sequencek/index/SequenceKIndex.kt | 65 ++++++++++++++++++ 7 files changed, 314 insertions(+), 4 deletions(-) create mode 100644 arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/each/SequenceKEach.kt create mode 100644 arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/filterIndex/SequenceKFilterIndex.kt create mode 100644 arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt create mode 100644 arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/each/SequenceKEach.kt create mode 100644 arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/filterIndex/SequenceKFilterIndex.kt create mode 100644 arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/each/SequenceKEach.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/each/SequenceKEach.kt new file mode 100644 index 0000000..0fc566d --- /dev/null +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/each/SequenceKEach.kt @@ -0,0 +1,44 @@ +package arrow.optics.extensions.sequence.each + +import arrow.core.SequenceK +import arrow.optics.PTraversal +import arrow.optics.extensions.SequenceKEach +import kotlin.Any +import kotlin.Deprecated +import kotlin.PublishedApi +import kotlin.Suppress +import kotlin.jvm.JvmName + +@JvmName("each") +@Suppress( + "UNCHECKED_CAST", + "USELESS_CAST", + "EXTENSION_SHADOWED_BY_MEMBER", + "UNUSED_PARAMETER" +) +@Deprecated( + "@extension kinded projected functions are deprecated", + ReplaceWith( + "each()", + "arrow.optics.extensions.sequence.each.Sequence.each" + ), + DeprecationLevel.WARNING +) +fun each(): PTraversal, SequenceK, A, A> = + arrow.optics.extensions.sequence.each.Sequence + .each() + .each() as arrow.optics.PTraversal, arrow.core.SequenceK, A, A> + +/** + * cached extension + */ +@PublishedApi() +internal val each_singleton: SequenceKEach = object : SequenceKEach {} + +object Sequence { + @Suppress( + "UNCHECKED_CAST", + "NOTHING_TO_INLINE" + ) + inline fun each(): SequenceKEach = each_singleton as + arrow.optics.extensions.SequenceKEach} diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/filterIndex/SequenceKFilterIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/filterIndex/SequenceKFilterIndex.kt new file mode 100644 index 0000000..346dd82 --- /dev/null +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/filterIndex/SequenceKFilterIndex.kt @@ -0,0 +1,48 @@ +package arrow.optics.extensions.sequence.filterIndex + +import arrow.core.SequenceK +import arrow.optics.PTraversal +import arrow.optics.extensions.SequenceKFilterIndex +import kotlin.Any +import kotlin.Boolean +import kotlin.Deprecated +import kotlin.Function1 +import kotlin.Int +import kotlin.PublishedApi +import kotlin.Suppress +import kotlin.jvm.JvmName + +@JvmName("filter") +@Suppress( + "UNCHECKED_CAST", + "USELESS_CAST", + "EXTENSION_SHADOWED_BY_MEMBER", + "UNUSED_PARAMETER" +) +@Deprecated( + "@extension kinded projected functions are deprecated", + ReplaceWith( + "filter(p)", + "arrow.optics.extensions.sequence.filterIndex.Sequence.filter" + ), + DeprecationLevel.WARNING +) +fun filter(p: Function1): PTraversal, SequenceK, A, A> = + arrow.optics.extensions.sequence.filterIndex.Sequence + .filterIndex() + .filter(p) as arrow.optics.PTraversal, arrow.core.SequenceK, A, A> + +/** + * cached extension + */ +@PublishedApi() +internal val filterIndex_singleton: SequenceKFilterIndex = object : SequenceKFilterIndex + {} + +object Sequence { + @Suppress( + "UNCHECKED_CAST", + "NOTHING_TO_INLINE" + ) + inline fun filterIndex(): SequenceKFilterIndex = filterIndex_singleton as + arrow.optics.extensions.SequenceKFilterIndex} diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt new file mode 100644 index 0000000..c418168 --- /dev/null +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt @@ -0,0 +1,66 @@ +package arrow.optics.extensions.sequence.index + +import arrow.core.SequenceK +import arrow.optics.PLens +import arrow.optics.POptional +import arrow.optics.extensions.SequenceKIndex +import kotlin.Any +import kotlin.Deprecated +import kotlin.Int +import kotlin.PublishedApi +import kotlin.Suppress +import kotlin.jvm.JvmName + +@JvmName("index") +@Suppress( + "UNCHECKED_CAST", + "USELESS_CAST", + "EXTENSION_SHADOWED_BY_MEMBER", + "UNUSED_PARAMETER" +) +@Deprecated( + "@extension kinded projected functions are deprecated", + ReplaceWith( + "index(i)", + "arrow.optics.extensions.sequence.index.Sequence.index" + ), + DeprecationLevel.WARNING +) +fun index(i: Int): POptional, SequenceK, A, A> = + arrow.optics.extensions.sequence.index.Sequence + .index() + .index(i) as arrow.optics.POptional, arrow.core.SequenceK, A, A> + +@JvmName("get") +@Suppress( + "UNCHECKED_CAST", + "USELESS_CAST", + "EXTENSION_SHADOWED_BY_MEMBER", + "UNUSED_PARAMETER" +) +@Deprecated( + "@extension kinded projected functions are deprecated", + ReplaceWith( + "get(i)", + "arrow.core.get" + ), + DeprecationLevel.WARNING +) +operator fun PLens, SequenceK>.get(i: Int): POptional = + arrow.optics.extensions.sequence.index.Sequence.index().run { + this@get.get(i) as arrow.optics.POptional +} + +/** + * cached extension + */ +@PublishedApi() +internal val index_singleton: SequenceKIndex = object : SequenceKIndex {} + +object Sequence { + @Suppress( + "UNCHECKED_CAST", + "NOTHING_TO_INLINE" + ) + inline fun index(): SequenceKIndex = index_singleton as + arrow.optics.extensions.SequenceKIndex} diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek.kt index f1522b5..17e7bff 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek.kt @@ -6,7 +6,6 @@ import arrow.core.k import arrow.core.left import arrow.core.right import arrow.core.toT -import arrow.extension import arrow.optics.Optional import arrow.optics.POptional import arrow.optics.Traversal @@ -29,7 +28,6 @@ fun SequenceK.Companion.traversal(): Traversal, A> = object : T /** * [Each] instance definition for [SequenceK]. */ -@extension interface SequenceKEach : Each, A> { override fun each(): Traversal, A> = SequenceK.traversal() @@ -38,7 +36,6 @@ interface SequenceKEach : Each, A> { /** * [FilterIndex] instance definition for [SequenceK]. */ -@extension interface SequenceKFilterIndex : FilterIndex, Int, A> { override fun filter(p: (Int) -> Boolean): Traversal, A> = object : Traversal, A> { override fun modifyF(FA: Applicative, s: SequenceK, f: (A) -> Kind): Kind> = FA.run { @@ -52,7 +49,6 @@ interface SequenceKFilterIndex : FilterIndex, Int, A> { /** * [Index] instance definition for [SequenceK]. */ -@extension interface SequenceKIndex : Index, Int, A> { override fun index(i: Int): Optional, A> = POptional( getOrModify = { it.elementAtOrNull(i)?.right() ?: it.left() }, diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/each/SequenceKEach.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/each/SequenceKEach.kt new file mode 100644 index 0000000..6b09053 --- /dev/null +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/each/SequenceKEach.kt @@ -0,0 +1,43 @@ +package arrow.optics.extensions.sequencek.each + +import arrow.core.SequenceK +import arrow.core.SequenceK.Companion +import arrow.optics.PTraversal +import arrow.optics.extensions.SequenceKEach +import kotlin.Any +import kotlin.Deprecated +import kotlin.PublishedApi +import kotlin.Suppress +import kotlin.jvm.JvmName + +/** + * cached extension + */ +@PublishedApi() +internal val each_singleton: SequenceKEach = object : SequenceKEach {} + +@JvmName("each") +@Suppress( + "UNCHECKED_CAST", + "USELESS_CAST", + "EXTENSION_SHADOWED_BY_MEMBER", + "UNUSED_PARAMETER" +) +@Deprecated( + "@extension kinded projected functions are deprecated", + ReplaceWith( + "each()", + "arrow.core.SequenceK.each" + ), + DeprecationLevel.WARNING +) +fun each(): PTraversal, SequenceK, A, A> = arrow.core.SequenceK + .each() + .each() as arrow.optics.PTraversal, arrow.core.SequenceK, A, A> + +@Suppress( + "UNCHECKED_CAST", + "NOTHING_TO_INLINE" +) +inline fun Companion.each(): SequenceKEach = each_singleton as + arrow.optics.extensions.SequenceKEach diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/filterIndex/SequenceKFilterIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/filterIndex/SequenceKFilterIndex.kt new file mode 100644 index 0000000..ed6a061 --- /dev/null +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/filterIndex/SequenceKFilterIndex.kt @@ -0,0 +1,48 @@ +package arrow.optics.extensions.sequencek.filterIndex + +import arrow.core.SequenceK +import arrow.core.SequenceK.Companion +import arrow.optics.PTraversal +import arrow.optics.extensions.SequenceKFilterIndex +import kotlin.Any +import kotlin.Boolean +import kotlin.Deprecated +import kotlin.Function1 +import kotlin.Int +import kotlin.PublishedApi +import kotlin.Suppress +import kotlin.jvm.JvmName + +/** + * cached extension + */ +@PublishedApi() +internal val filterIndex_singleton: SequenceKFilterIndex = object : SequenceKFilterIndex + {} + +@JvmName("filter") +@Suppress( + "UNCHECKED_CAST", + "USELESS_CAST", + "EXTENSION_SHADOWED_BY_MEMBER", + "UNUSED_PARAMETER" +) +@Deprecated( + "@extension kinded projected functions are deprecated", + ReplaceWith( + "filter(p)", + "arrow.core.SequenceK.filter" + ), + DeprecationLevel.WARNING +) +fun filter(p: Function1): PTraversal, SequenceK, A, A> = + arrow.core.SequenceK + .filterIndex() + .filter(p) as arrow.optics.PTraversal, arrow.core.SequenceK, A, A> + +@Suppress( + "UNCHECKED_CAST", + "NOTHING_TO_INLINE" +) +inline fun Companion.filterIndex(): SequenceKFilterIndex = filterIndex_singleton as + arrow.optics.extensions.SequenceKFilterIndex diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt new file mode 100644 index 0000000..f4dd512 --- /dev/null +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt @@ -0,0 +1,65 @@ +package arrow.optics.extensions.sequencek.index + +import arrow.core.SequenceK +import arrow.core.SequenceK.Companion +import arrow.optics.PLens +import arrow.optics.POptional +import arrow.optics.extensions.SequenceKIndex +import kotlin.Any +import kotlin.Deprecated +import kotlin.Int +import kotlin.PublishedApi +import kotlin.Suppress +import kotlin.jvm.JvmName + +/** + * cached extension + */ +@PublishedApi() +internal val index_singleton: SequenceKIndex = object : SequenceKIndex {} + +@JvmName("index") +@Suppress( + "UNCHECKED_CAST", + "USELESS_CAST", + "EXTENSION_SHADOWED_BY_MEMBER", + "UNUSED_PARAMETER" +) +@Deprecated( + "@extension kinded projected functions are deprecated", + ReplaceWith( + "index(i)", + "arrow.core.SequenceK.index" + ), + DeprecationLevel.WARNING +) +fun index(i: Int): POptional, SequenceK, A, A> = arrow.core.SequenceK + .index() + .index(i) as arrow.optics.POptional, arrow.core.SequenceK, A, A> + +@JvmName("get") +@Suppress( + "UNCHECKED_CAST", + "USELESS_CAST", + "EXTENSION_SHADOWED_BY_MEMBER", + "UNUSED_PARAMETER" +) +@Deprecated( + "@extension kinded projected functions are deprecated", + ReplaceWith( + "get(i)", + "arrow.core.get" + ), + DeprecationLevel.WARNING +) +operator fun PLens, SequenceK>.get(i: Int): POptional = + arrow.core.SequenceK.index().run { + this@get.get(i) as arrow.optics.POptional +} + +@Suppress( + "UNCHECKED_CAST", + "NOTHING_TO_INLINE" +) +inline fun Companion.index(): SequenceKIndex = index_singleton as + arrow.optics.extensions.SequenceKIndex From fa14a8c358bc59a8c67146e2151bfd41949f8814 Mon Sep 17 00:00:00 2001 From: franciscodr Date: Wed, 13 Jan 2021 18:23:44 +0100 Subject: [PATCH 2/3] Add typeclass instances for Sequence --- .../extensions/sequence/each/SequenceKEach.kt | 20 +++--- .../filterIndex/SequenceKFilterIndex.kt | 23 +++---- .../sequence/index/SequenceKIndex.kt | 29 ++++---- .../arrow/optics/extensions/sequencek.kt | 29 ++++++++ .../sequencek/each/SequenceKEach.kt | 19 +++--- .../filterIndex/SequenceKFilterIndex.kt | 22 +++---- .../sequencek/index/SequenceKIndex.kt | 28 ++++---- .../main/kotlin/arrow/optics/std/sequence.kt | 33 ++++++++++ .../optics/instances/SequenceInstanceTest.kt | 66 +++++++++++++++++++ 9 files changed, 199 insertions(+), 70 deletions(-) create mode 100644 arrow-optics/src/main/kotlin/arrow/optics/std/sequence.kt create mode 100644 arrow-optics/src/test/kotlin/arrow/optics/instances/SequenceInstanceTest.kt diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/each/SequenceKEach.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/each/SequenceKEach.kt index 0fc566d..23622e4 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/each/SequenceKEach.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/each/SequenceKEach.kt @@ -3,11 +3,6 @@ package arrow.optics.extensions.sequence.each import arrow.core.SequenceK import arrow.optics.PTraversal import arrow.optics.extensions.SequenceKEach -import kotlin.Any -import kotlin.Deprecated -import kotlin.PublishedApi -import kotlin.Suppress -import kotlin.jvm.JvmName @JvmName("each") @Suppress( @@ -17,11 +12,10 @@ import kotlin.jvm.JvmName "UNUSED_PARAMETER" ) @Deprecated( - "@extension kinded projected functions are deprecated", + "Each is being deprecated. Use the instance for Sequence from Traversal's companion object instead.", ReplaceWith( - "each()", - "arrow.optics.extensions.sequence.each.Sequence.each" - ), + "Traversal.sequence()", + "arrow.optics.Traversal", "arrow.optics.sequence"), DeprecationLevel.WARNING ) fun each(): PTraversal, SequenceK, A, A> = @@ -35,10 +29,18 @@ fun each(): PTraversal, SequenceK, A, A> = @PublishedApi() internal val each_singleton: SequenceKEach = object : SequenceKEach {} +@Deprecated("Receiver Sequence object is deprecated, and it will be removed in 0.13.") object Sequence { @Suppress( "UNCHECKED_CAST", "NOTHING_TO_INLINE" ) + @Deprecated( + "Each is being deprecated. Use the instance for Sequence from Traversal's companion object instead.", + ReplaceWith( + "Traversal.sequence()", + "arrow.optics.Traversal", "arrow.optics.sequence"), + DeprecationLevel.WARNING + ) inline fun each(): SequenceKEach = each_singleton as arrow.optics.extensions.SequenceKEach} diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/filterIndex/SequenceKFilterIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/filterIndex/SequenceKFilterIndex.kt index 346dd82..08465ce 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/filterIndex/SequenceKFilterIndex.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/filterIndex/SequenceKFilterIndex.kt @@ -3,14 +3,6 @@ package arrow.optics.extensions.sequence.filterIndex import arrow.core.SequenceK import arrow.optics.PTraversal import arrow.optics.extensions.SequenceKFilterIndex -import kotlin.Any -import kotlin.Boolean -import kotlin.Deprecated -import kotlin.Function1 -import kotlin.Int -import kotlin.PublishedApi -import kotlin.Suppress -import kotlin.jvm.JvmName @JvmName("filter") @Suppress( @@ -20,10 +12,10 @@ import kotlin.jvm.JvmName "UNUSED_PARAMETER" ) @Deprecated( - "@extension kinded projected functions are deprecated", + "arrow.optics.extensions package is being deprecated. Use the exposed function in the instance for Sequence from the companion object of the typeclass instead.", ReplaceWith( - "filter(p)", - "arrow.optics.extensions.sequence.filterIndex.Sequence.filter" + "FilterIndex.sequence().filter(p)", + "arrow.optics.sequence", "arrow.optics.typeclasses.FilterIndex" ), DeprecationLevel.WARNING ) @@ -39,10 +31,19 @@ fun filter(p: Function1): PTraversal, SequenceK = object : SequenceKFilterIndex {} +@Deprecated("Receiver Sequence object is deprecated, and it will be removed in 0.13.") object Sequence { @Suppress( "UNCHECKED_CAST", "NOTHING_TO_INLINE" ) + @Deprecated( + "Typeclass instance have been moved to the companion object of the typeclass.", + ReplaceWith( + "FilterIndex.sequence()", + "arrow.optics.sequence", "arrow.optics.typeclasses.FilterIndex" + ), + DeprecationLevel.WARNING + ) inline fun filterIndex(): SequenceKFilterIndex = filterIndex_singleton as arrow.optics.extensions.SequenceKFilterIndex} diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt index c418168..e44070b 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt @@ -4,12 +4,6 @@ import arrow.core.SequenceK import arrow.optics.PLens import arrow.optics.POptional import arrow.optics.extensions.SequenceKIndex -import kotlin.Any -import kotlin.Deprecated -import kotlin.Int -import kotlin.PublishedApi -import kotlin.Suppress -import kotlin.jvm.JvmName @JvmName("index") @Suppress( @@ -19,10 +13,10 @@ import kotlin.jvm.JvmName "UNUSED_PARAMETER" ) @Deprecated( - "@extension kinded projected functions are deprecated", + "arrow.optics.extensions package is being deprecated. Use the exposed function in the instance for Sequence from the companion object of the typeclass instead.", ReplaceWith( - "index(i)", - "arrow.optics.extensions.sequence.index.Sequence.index" + "Index.sequence().index(i)", + "arrow.optics.sequence", "arrow.optics.typeclasses.Index" ), DeprecationLevel.WARNING ) @@ -39,12 +33,8 @@ fun index(i: Int): POptional, SequenceK, A, A> = "UNUSED_PARAMETER" ) @Deprecated( - "@extension kinded projected functions are deprecated", - ReplaceWith( - "get(i)", - "arrow.core.get" - ), - DeprecationLevel.WARNING + "arrow.optics.extensions package is being deprecated, and it will be removed in 0.13.", + level = DeprecationLevel.WARNING ) operator fun PLens, SequenceK>.get(i: Int): POptional = arrow.optics.extensions.sequence.index.Sequence.index().run { @@ -57,10 +47,19 @@ operator fun PLens, SequenceK>.get(i: Int): POption @PublishedApi() internal val index_singleton: SequenceKIndex = object : SequenceKIndex {} +@Deprecated("Receiver Sequence object is deprecated, and it will be removed in 0.13.") object Sequence { @Suppress( "UNCHECKED_CAST", "NOTHING_TO_INLINE" ) + @Deprecated( + "Typeclass instance have been moved to the companion object of the typeclass.", + ReplaceWith( + "Index.sequence()", + "arrow.optics.sequence", "arrow.optics.typeclasses.Index" + ), + DeprecationLevel.WARNING + ) inline fun index(): SequenceKIndex = index_singleton as arrow.optics.extensions.SequenceKIndex} diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek.kt index 17e7bff..a3f22ae 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek.kt @@ -20,6 +20,13 @@ import arrow.typeclasses.Applicative * @receiver [SequenceK.Companion] to make it statically available. * @return [Traversal] with source [SequenceK] and focus in every [A] of the source. */ +@Deprecated( + "SequenceK is being deprecated. Use the instance for Sequence from the companion object of the typeclass.", + ReplaceWith( + "Traversal.sequence()", + "arrow.optics.Traversal", "arrow.optics.sequence"), + DeprecationLevel.WARNING +) fun SequenceK.Companion.traversal(): Traversal, A> = object : Traversal, A> { override fun modifyF(FA: Applicative, s: SequenceK, f: (A) -> Kind): Kind> = s.traverse(FA, f) @@ -28,6 +35,12 @@ fun SequenceK.Companion.traversal(): Traversal, A> = object : T /** * [Each] instance definition for [SequenceK]. */ +@Deprecated( + "Each is being deprecated. Use the instance for List from Traversal's companion object instead.", + ReplaceWith( + "Traversal.sequence()", + "arrow.optics.Traversal", "arrow.optics.sequence"), + DeprecationLevel.WARNING) interface SequenceKEach : Each, A> { override fun each(): Traversal, A> = SequenceK.traversal() @@ -36,6 +49,14 @@ interface SequenceKEach : Each, A> { /** * [FilterIndex] instance definition for [SequenceK]. */ +@Deprecated( + "Typeclass interface implementation will not be exposed directly anymore.", + ReplaceWith( + "FilterIndex.sequence()", + "arrow.optics.map", "arrow.optics.typeclasses.FilterIndex" + ), + DeprecationLevel.WARNING +) interface SequenceKFilterIndex : FilterIndex, Int, A> { override fun filter(p: (Int) -> Boolean): Traversal, A> = object : Traversal, A> { override fun modifyF(FA: Applicative, s: SequenceK, f: (A) -> Kind): Kind> = FA.run { @@ -49,6 +70,14 @@ interface SequenceKFilterIndex : FilterIndex, Int, A> { /** * [Index] instance definition for [SequenceK]. */ +@Deprecated( + "Typeclass interface implementation will not be exposed directly anymore.", + ReplaceWith( + "Index.sequence()", + "arrow.optics.map", "arrow.optics.typeclasses.Index" + ), + DeprecationLevel.WARNING +) interface SequenceKIndex : Index, Int, A> { override fun index(i: Int): Optional, A> = POptional( getOrModify = { it.elementAtOrNull(i)?.right() ?: it.left() }, diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/each/SequenceKEach.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/each/SequenceKEach.kt index 6b09053..e11b1a9 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/each/SequenceKEach.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/each/SequenceKEach.kt @@ -4,11 +4,6 @@ import arrow.core.SequenceK import arrow.core.SequenceK.Companion import arrow.optics.PTraversal import arrow.optics.extensions.SequenceKEach -import kotlin.Any -import kotlin.Deprecated -import kotlin.PublishedApi -import kotlin.Suppress -import kotlin.jvm.JvmName /** * cached extension @@ -24,11 +19,10 @@ internal val each_singleton: SequenceKEach = object : SequenceKEach "UNUSED_PARAMETER" ) @Deprecated( - "@extension kinded projected functions are deprecated", + "Each is being deprecated. Use the instance for Sequence from Traversal's companion object instead.", ReplaceWith( - "each()", - "arrow.core.SequenceK.each" - ), + "Traversal.sequence()", + "arrow.optics.Traversal", "arrow.optics.sequence"), DeprecationLevel.WARNING ) fun each(): PTraversal, SequenceK, A, A> = arrow.core.SequenceK @@ -39,5 +33,12 @@ fun each(): PTraversal, SequenceK, A, A> = arrow.core.Sequen "UNCHECKED_CAST", "NOTHING_TO_INLINE" ) +@Deprecated( + "Each is being deprecated. Use the instance for Sequence from Traversal's companion object instead.", + ReplaceWith( + "Traversal.sequence()", + "arrow.optics.Traversal", "arrow.optics.sequence"), + DeprecationLevel.WARNING +) inline fun Companion.each(): SequenceKEach = each_singleton as arrow.optics.extensions.SequenceKEach diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/filterIndex/SequenceKFilterIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/filterIndex/SequenceKFilterIndex.kt index ed6a061..81407ab 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/filterIndex/SequenceKFilterIndex.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/filterIndex/SequenceKFilterIndex.kt @@ -4,14 +4,6 @@ import arrow.core.SequenceK import arrow.core.SequenceK.Companion import arrow.optics.PTraversal import arrow.optics.extensions.SequenceKFilterIndex -import kotlin.Any -import kotlin.Boolean -import kotlin.Deprecated -import kotlin.Function1 -import kotlin.Int -import kotlin.PublishedApi -import kotlin.Suppress -import kotlin.jvm.JvmName /** * cached extension @@ -28,10 +20,10 @@ internal val filterIndex_singleton: SequenceKFilterIndex = object : Sequen "UNUSED_PARAMETER" ) @Deprecated( - "@extension kinded projected functions are deprecated", + "arrow.optics.extensions package is being deprecated. Use the exposed function in the instance for Sequence from the companion object of the typeclass instead.", ReplaceWith( - "filter(p)", - "arrow.core.SequenceK.filter" + "FilterIndex.sequence().filter(p)", + "arrow.optics.sequence", "arrow.optics.typeclasses.FilterIndex" ), DeprecationLevel.WARNING ) @@ -44,5 +36,13 @@ fun filter(p: Function1): PTraversal, SequenceK()", + "arrow.optics.sequence", "arrow.optics.typeclasses.FilterIndex" + ), + DeprecationLevel.WARNING +) inline fun Companion.filterIndex(): SequenceKFilterIndex = filterIndex_singleton as arrow.optics.extensions.SequenceKFilterIndex diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt index f4dd512..005c6f7 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt @@ -5,12 +5,6 @@ import arrow.core.SequenceK.Companion import arrow.optics.PLens import arrow.optics.POptional import arrow.optics.extensions.SequenceKIndex -import kotlin.Any -import kotlin.Deprecated -import kotlin.Int -import kotlin.PublishedApi -import kotlin.Suppress -import kotlin.jvm.JvmName /** * cached extension @@ -26,10 +20,10 @@ internal val index_singleton: SequenceKIndex = object : SequenceKIndex().index(i)", + "arrow.optics.sequence", "arrow.optics.typeclasses.Index" ), DeprecationLevel.WARNING ) @@ -45,12 +39,8 @@ fun index(i: Int): POptional, SequenceK, A, A> = arrow.core. "UNUSED_PARAMETER" ) @Deprecated( - "@extension kinded projected functions are deprecated", - ReplaceWith( - "get(i)", - "arrow.core.get" - ), - DeprecationLevel.WARNING + "arrow.optics.extensions package is being deprecated, and it will be removed in 0.13.", + level = DeprecationLevel.WARNING ) operator fun PLens, SequenceK>.get(i: Int): POptional = arrow.core.SequenceK.index().run { @@ -61,5 +51,13 @@ operator fun PLens, SequenceK>.get(i: Int): POption "UNCHECKED_CAST", "NOTHING_TO_INLINE" ) +@Deprecated( + "SequenceK is being deprecated. Use the instance for Sequence from the companion object of the typeclass.", + ReplaceWith( + "Index.sequence()", + "arrow.optics.sequence", "arrow.optics.typeclasses.Index" + ), + DeprecationLevel.WARNING +) inline fun Companion.index(): SequenceKIndex = index_singleton as arrow.optics.extensions.SequenceKIndex diff --git a/arrow-optics/src/main/kotlin/arrow/optics/std/sequence.kt b/arrow-optics/src/main/kotlin/arrow/optics/std/sequence.kt new file mode 100644 index 0000000..e879e0e --- /dev/null +++ b/arrow-optics/src/main/kotlin/arrow/optics/std/sequence.kt @@ -0,0 +1,33 @@ +package arrow.optics + +import arrow.Kind +import arrow.core.k +import arrow.core.left +import arrow.core.right +import arrow.core.toT +import arrow.optics.typeclasses.FilterIndex +import arrow.optics.typeclasses.Index +import arrow.typeclasses.Applicative + +fun FilterIndex.Companion.sequence(): FilterIndex, Int, A> = FilterIndex { p -> + object : Traversal, A> { + override fun modifyF(FA: Applicative, s: Sequence, f: (A) -> Kind): Kind> = + FA.run { + s.mapIndexed { index, a -> a toT index }.k().traverse(FA) { (a, j) -> if (p(j)) f(a) else just(a) + } + } + } +} + +fun Index.Companion.sequence(): Index, Int, A> = Index { i -> + POptional( + getOrModify = { it.elementAtOrNull(i)?.right() ?: it.left() }, + set = { s, a -> s.mapIndexed { index, aa -> if (index == i) a else aa } } + ) +} + +fun PTraversal.Companion.sequence(): Traversal, A> = + object : Traversal, A> { + override fun modifyF(FA: Applicative, s: Sequence, f: (A) -> Kind): Kind> = + FA.run { s.k().traverse(FA, f) } + } diff --git a/arrow-optics/src/test/kotlin/arrow/optics/instances/SequenceInstanceTest.kt b/arrow-optics/src/test/kotlin/arrow/optics/instances/SequenceInstanceTest.kt new file mode 100644 index 0000000..331173e --- /dev/null +++ b/arrow-optics/src/test/kotlin/arrow/optics/instances/SequenceInstanceTest.kt @@ -0,0 +1,66 @@ +package arrow.optics.instances + +import arrow.core.Option +import arrow.core.SequenceK +import arrow.core.extensions.eq +import arrow.core.extensions.option.eq.eq +import arrow.core.extensions.sequencek.eq.eq +import arrow.core.list +import arrow.core.test.UnitSpec +import arrow.core.test.generators.functionAToB +import arrow.optics.Traversal +import arrow.optics.sequence +import arrow.optics.test.laws.OptionalLaws +import arrow.optics.test.laws.TraversalLaws +import arrow.optics.typeclasses.FilterIndex +import arrow.optics.typeclasses.Index +import arrow.typeclasses.Eq +import io.kotlintest.properties.Gen + +class SequenceInstanceTest : UnitSpec() { + + private fun Gen.Companion.sequence(genA: Gen): Gen> = list(genA).map { it.asSequence() } + + private fun sequenceEq(eqA: Eq): Eq> = object : Eq> { + override fun Sequence.eqv(b: Sequence): Boolean = + SequenceK.eq(eqA).run { SequenceK(this@eqv).eqv(SequenceK(b)) } + } + + init { + + testLaws( + TraversalLaws.laws( + traversal = Traversal.sequence(), + aGen = Gen.sequence(Gen.string()), + bGen = Gen.string(), + funcGen = Gen.functionAToB(Gen.string()), + EQA = sequenceEq(String.eq()), + EQOptionB = Option.eq(String.eq()), + EQListB = Eq.list(String.eq()) + ) + ) + + testLaws( + TraversalLaws.laws( + traversal = FilterIndex.sequence().filter { true }, + aGen = Gen.sequence(Gen.string()), + bGen = Gen.string(), + funcGen = Gen.functionAToB(Gen.string()), + EQA = sequenceEq(String.eq()), + EQListB = Eq.list(String.eq()), + EQOptionB = Option.eq(String.eq()) + ) + ) + + testLaws( + OptionalLaws.laws( + optionalGen = Gen.int().map { Index.sequence().index(it) }, + aGen = Gen.sequence(Gen.string()), + bGen = Gen.string(), + funcGen = Gen.functionAToB(Gen.string()), + EQOptionB = Option.eq(String.eq()), + EQA = sequenceEq(String.eq()) + ) + ) + } +} From 8f28fa02bfb697ebf06e4034949324e7485a94a4 Mon Sep 17 00:00:00 2001 From: franciscodr Date: Fri, 15 Jan 2021 09:48:44 +0100 Subject: [PATCH 3/3] Add ReplaceWith in deprecation messages --- .../arrow/optics/extensions/sequence/index/SequenceKIndex.kt | 4 ++++ .../arrow/optics/extensions/sequencek/index/SequenceKIndex.kt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt index e44070b..b377732 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequence/index/SequenceKIndex.kt @@ -34,6 +34,10 @@ fun index(i: Int): POptional, SequenceK, A, A> = ) @Deprecated( "arrow.optics.extensions package is being deprecated, and it will be removed in 0.13.", + ReplaceWith( + "this compose Index.sequence().index(i)", + "arrow.optics.compose", "arrow.optics.sequence", "arrow.optics.typeclasses.Index" + ), level = DeprecationLevel.WARNING ) operator fun PLens, SequenceK>.get(i: Int): POptional = diff --git a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt index 005c6f7..57408c4 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/extensions/sequencek/index/SequenceKIndex.kt @@ -40,6 +40,10 @@ fun index(i: Int): POptional, SequenceK, A, A> = arrow.core. ) @Deprecated( "arrow.optics.extensions package is being deprecated, and it will be removed in 0.13.", + ReplaceWith( + "this compose Index.sequence().index(i)", + "arrow.optics.compose", "arrow.optics.sequence", "arrow.optics.typeclasses.Index" + ), level = DeprecationLevel.WARNING ) operator fun PLens, SequenceK>.get(i: Int): POptional =