Как я могу использовать Arrow-kt Some() в коде Groovy?

Я пытаюсь протестировать мой код Kotlin, который имеет типы Arrow-kt, используя Spock в Groovy. Тем не менее, я не могу использовать дополнения Arrow-KT, такие как Some, Например, у меня есть тест следующим образом:

    @Unroll
    def "add returns #expected for queryRecord #queryRecord"() {
        given:
        def ip = "ip"
        def rule = "rule"

        when:
        def result = unit.add(ip, rule)

        then:
        1 * dynamoDBMapperMock.load(ActionRecord.class, ip) >> queryRecord

        result == expected

        where:
        queryRecord        | expected
        new ActionRecord() | None.INSTANCE
        null               | Some(new ActionInternal("ip"))
    }

В то время как первая строка данных проходит без проблем, вторая - со следующей ошибкой:

groovy.lang.MissingMethodException: No signature of method: package.name.EventSpec.Some() is applicable for argument types: (package.name.ActionInternal) values: [ActionInternal(dropletIp=null)] Possible solutions: Mock(), Spy(), Stub(), dump(), Mock(groovy.lang.Closure), Mock(java.lang.Class)

я пробовал .some() как хорошо, но безрезультатно. Очевидно, Groovy не может получить доступ к расширениям Kotlin, но Some это просто класс данных [ 1], поэтому я не уверен, почему я не могу использовать его в Groovy.

1 ответ

Решение

Да, вы можете использовать Arrow Datatypes в Groovy, результат не так идиоматичен, как в Kotlin потому что библиотека сильно зависит от функций расширения и функций в companion object

пример

import arrow.core.Option
import static arrow.core.OptionKt.getOrElse

static main(args){
    println 'What is your name?'
    def name = Option.@Companion.fromNullable(System.in.newReader().readLine())
        .filterNot { it.isEmpty() }
        .map { it.toUpperCase() }

    println("Welcome ${getOrElse(name) { 'Anonymous' }}")
}

Выход

'Welcome JOHN' (or 'Welcome Anonymous' if the provided name is null or empty) 

Как видите, чтобы можно было использовать getOrElse функция расширения, нам нужно импортировать ее как статический метод

намек

Не использовать Some непосредственно, если вы не уверены, что значение не nullв противном случае вы должны полагаться на Option.fromNullable безопасно поднять значение до Option контекст (т.е. создать Some или же None в зависимости от значения null или нет)

Другие вопросы по тегам