Skip to content

Commit 3b2313d

Browse files
committed
feat: apply suggestion of removing nested either of SimpleSequenceChain
1 parent 38fd29c commit 3b2313d

File tree

2 files changed

+20
-31
lines changed

2 files changed

+20
-31
lines changed

src/commonMain/kotlin/com/xebia/functional/chains/SimpleSequenceChain.kt

+16-15
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
package com.xebia.functional.chains
22

33
import arrow.core.Either
4-
import arrow.core.NonEmptyList
54
import arrow.core.raise.Raise
65
import arrow.core.raise.either
76
import arrow.core.raise.ensure
87
import arrow.core.raise.ensureNotNull
8+
import arrow.core.raise.recover
99
import arrow.core.raise.zipOrAccumulate
1010

11-
fun Raise<Chain.Error>.SimpleSequentialChain(
11+
fun Raise<Chain.Error>.SimpleSequenceChain(
1212
chains: List<Chain>,
1313
inputKey: String = "input",
1414
outputKey: String = "output",
1515
chainOutput: Chain.ChainOutput = Chain.ChainOutput.OnlyOutput
16-
): SimpleSequentialChain =
17-
SimpleSequentialChain.either(chains, inputKey, outputKey, chainOutput).bind()
16+
): SimpleSequenceChain =
17+
SimpleSequenceChain.either(chains, inputKey, outputKey, chainOutput).bind()
1818

19-
class SimpleSequentialChain private constructor(
19+
class SimpleSequenceChain private constructor(
2020
private val chains: List<Chain>,
2121
private val inputKey: String,
2222
private val outputKey: String,
@@ -37,20 +37,21 @@ class SimpleSequentialChain private constructor(
3737

3838
companion object {
3939
fun either(
40-
chains: List<Chain>, inputKey: String, outputKey: String, chainOutput: Chain.ChainOutput
41-
): Either<SequenceChain.InvalidKeys, SimpleSequentialChain> =
40+
chains: List<Chain>,
41+
inputKey: String,
42+
outputKey: String,
43+
chainOutput: Chain.ChainOutput
44+
): Either<SequenceChain.InvalidKeys, SimpleSequenceChain> =
4245
either {
43-
chains.map { chain ->
44-
either<NonEmptyList<Chain.Error>, Chain> {
46+
val mappedChains: List<Chain> = chains.map { chain ->
47+
recover({
4548
zipOrAccumulate(
4649
{ validateInputKeys(chain.config.inputKeys) },
47-
{ validateOutputKeys(chain.config.outputKeys) }
48-
) { _, _ -> chain }
49-
}.bind()
50+
{ validateOutputKeys(chain.config.outputKeys) }) { _, _ -> chain }
51+
}) { raise(SequenceChain.InvalidKeys(it.joinToString(transform = Chain.Error::reason))) }
5052
}
51-
}.mapLeft {
52-
SequenceChain.InvalidKeys(it.joinToString(transform = Chain.Error::reason))
53-
}.map { SimpleSequentialChain(chains, inputKey, outputKey, chainOutput) }
53+
SimpleSequenceChain(mappedChains, inputKey, outputKey, chainOutput)
54+
}
5455
}
5556
}
5657

src/commonTest/kotlin/com/xebia/functional/chains/SimpleSequentialChainSpec.kt

+4-16
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class SimpleSequentialChainSpec : StringSpec({
1212
val chains = listOf(chain1)
1313

1414
either {
15-
val ssc = SimpleSequentialChain(chains = chains, chainOutput = Chain.ChainOutput.InputAndOutput)
15+
val ssc = SimpleSequenceChain(chains = chains, chainOutput = Chain.ChainOutput.InputAndOutput)
1616
ssc.run(mapOf("input" to "123")).bind()
1717
} shouldBeRight mapOf("input" to "123", "output" to "123dr")
1818
}
@@ -24,7 +24,7 @@ class SimpleSequentialChainSpec : StringSpec({
2424
val chains = listOf(chain1, chain2, chain3)
2525

2626
either {
27-
val ssc = SimpleSequentialChain(chains = chains, chainOutput = Chain.ChainOutput.InputAndOutput)
27+
val ssc = SimpleSequenceChain(chains = chains, chainOutput = Chain.ChainOutput.InputAndOutput)
2828
ssc.run(mapOf("input" to "123")).bind()
2929
} shouldBeRight mapOf("input" to "123", "output" to "123drdrdr")
3030
}
@@ -35,7 +35,7 @@ class SimpleSequentialChainSpec : StringSpec({
3535
val chains = listOf(chain1, chain2)
3636

3737
either {
38-
val ssc = SimpleSequentialChain(chains = chains, chainOutput = Chain.ChainOutput.InputAndOutput)
38+
val ssc = SimpleSequenceChain(chains = chains, chainOutput = Chain.ChainOutput.InputAndOutput)
3939
ssc.run(mapOf("input" to "123")).bind()
4040
} shouldBeLeft SequenceChain.InvalidKeys("The expected inputs are more than one: {bar}, {foo}")
4141
}
@@ -46,22 +46,10 @@ class SimpleSequentialChainSpec : StringSpec({
4646
val chains = listOf(chain1, chain2)
4747

4848
either {
49-
val ssc = SimpleSequentialChain(chains = chains, chainOutput = Chain.ChainOutput.InputAndOutput)
49+
val ssc = SimpleSequenceChain(chains = chains, chainOutput = Chain.ChainOutput.InputAndOutput)
5050
ssc.run(mapOf("input" to "123")).bind()
5151
} shouldBeLeft SequenceChain.InvalidKeys("The expected outputs are more than one: {bar}, {foo}")
5252
}
53-
54-
"SimpleSequentialChain should fail if multiple input and output variables are expected" {
55-
val chain1 = FakeChain(inputVariables = setOf("foo", "bar"), outputVariables = setOf("bar", "foo"))
56-
val chain2 = FakeChain(inputVariables = setOf("bar"), outputVariables = setOf("baz"))
57-
val chains = listOf(chain1, chain2)
58-
59-
either {
60-
val ssc = SimpleSequentialChain(chains = chains, chainOutput = Chain.ChainOutput.InputAndOutput)
61-
ssc.run(mapOf("input" to "123")).bind()
62-
} shouldBeLeft SequenceChain.InvalidKeys("The expected inputs are more than one: {foo}, {bar}, " +
63-
"The expected outputs are more than one: {bar}, {foo}")
64-
}
6553
})
6654

6755
data class FakeChain(private val inputVariables: Set<String>, private val outputVariables: Set<String>) : Chain {

0 commit comments

Comments
 (0)