Tupleライブラリ GuildのKotlin版作ってみた - 2016/12/09の30分 Kotlinメモ💪

2016/12/09の30分 Kotlinメモ💪

まあ30分以上やってるけどねー

今日はRetty Tech Cafe #8で「Kotlinでマッチョする話」というテーマで話すので、それのネタ仕込み。

retty.connpass.com

Guild Kotlin

GuildというJavaでTupleを作るライブラリを作っていて、それのKotlin版を作ってみた。

github.com

ブログに書いた「4つと5つ値を持つTupleを作ってみた」 + 「PairからTripleを作る拡張関数を書いてみた」の集大成。

hack-it-iron.hatenablog.com

hack-it-iron.hatenablog.com

A to B to Cという感じでtoつなぎでTripleを作ったり、A to B to C to Dで4つの値を持つTuple Quartetを作ったりできるライブラリになってる。

Quartetの実装は以下のようになってる。

package com.os.operando.guild

/**
 * A tuple of four elements.
 *
 * @param F  first element type
 * @param S  second element type
 * @param T  third element type
 * @param FO fourth element type
 * @property first First value
 * @property second Second value
 * @property third Third value
 * @property fourth Fourth value
 */
class Quartet<out F, out S, out T, out FO>(
        val first: F,
        val second: S,
        val third: T,
        val fourth: FO) {

    override fun toString(): String {
        return "Quartet(first=$first, second=$second, third=$third, fourth=$fourth)"
    }

    companion object {
        @JvmStatic
        fun <F, S, T, FO> create(first: F, second: S, third: T, fourth: FO): Quartet<F, S, T, FO> {
            return Quartet(first, second, third, fourth)
        }
    }
}

infix fun <A, B, C, D, E> Quartet<A, B, C, D>.to(that: E): Quintet<A, B, C, D, E> = Quintet(this.first, this.second, this.third, this.fourth, that)

Javaから使われることを考えてcompanion objectでcreateメソッド書いてみたけど、Java版 Guildがあるから、いらねーなこれって気づいた。

後々消す。

infixでゴニョゴニョ書いてるのは、toつなぎでQuartetから5つの値を持つ Tuple Quintetを作る拡張関数でやすん。

このtoつなぎでTuple生成するの気に入ってます。

Sample

Guild Kotlinは以下のような感じで使える。便利ー💪💪💪💪💪

package com.os.operando.guild.sample

import com.os.operando.guild.to
import java.time.LocalDateTime

fun main(args: Array<String>) {
    val triple = 1 to 10L to "triple"
    println(triple.first)
    println(triple.second)
    println(triple.third)

    val quartet = 1 to 10L to true to "quartet"
    println(quartet.first)
    println(quartet.second)
    println(quartet.third)
    println(quartet.fourth)

    val quintet = 1 to 10L to true to LocalDateTime.now() to "quintet"
    println(quintet.first)
    println(quintet.second)
    println(quintet.third)
    println(quintet.fourth)
    println(quintet.five)
}

後々jCenterに公開する。

group idとかどうしようかなーとかあって、まあ後々ちゃんとそこら辺色んなライブラリを参考にして公開する。

まとめ

資料作らないと...