-
Notifications
You must be signed in to change notification settings - Fork 452
/
Copy pathprism.kt
46 lines (42 loc) · 1.62 KB
/
prism.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package arrow.optics.plugin.internals
internal fun generatePrisms(ele: ADT, target: PrismTarget) =
Snippet(
`package` = ele.packageName,
name = ele.simpleName,
imports =
setOf("import arrow.core.left", "import arrow.core.right", "import arrow.core.identity"),
content = processElement(ele, target.foci),
)
private fun processElement(ele: ADT, foci: List<Focus>): String {
return foci.joinToString(separator = "\n\n") { focus ->
val sourceClassNameWithParams =
focus.refinedType?.qualifiedString() ?: "${ele.sourceClassName}${ele.angledTypeParameters}"
val angledTypeParameters = when {
focus.refinedArguments.isEmpty() -> ""
else -> focus.refinedArguments.joinToString(prefix = "<", separator = ",", postfix = ">")
}
val firstLine = when {
ele.typeParameters.isEmpty() ->
"${ele.visibilityModifierName} inline val ${ele.sourceClassName}.Companion.${focus.paramName}: $Prism<${ele.sourceClassName}, ${focus.className}> inline get()"
else ->
"${ele.visibilityModifierName} inline fun $angledTypeParameters ${ele.sourceClassName}.Companion.${focus.paramName}(): $Prism<$sourceClassNameWithParams, ${focus.className}>"
}
val elseBranch = if (focus.onlyOneSealedSubclass) {
""
} else """
| else -> ${ele.sourceName}.left()
""".trimMargin()
"""
|$firstLine = $Prism(
| getOrModify = { ${ele.sourceName}: $sourceClassNameWithParams ->
| when (${ele.sourceName}) {
| is ${focus.className} -> ${ele.sourceName}.right()
| $elseBranch
| }
| },
| reverseGet = ::identity
|)
|
""".trimMargin()
}
}