org.kynthus.hatalib.argparse.concept.Initial.scala Maven / Gradle / Ivy
The newest version!
package org.kynthus.hatalib.argparse.concept
import scala.annotation.implicitNotFound
/**
* 特定の型の初期値を保持できることを表します。
*
* このトレイトは型クラスとなっており、例えば[[scala.Predef.String]]の[[scala.List]]を、
* 初期値として持てるようにするには、例に示すような型クラスインスタンスを定義します。
*
* @tparam Derived 特定の型の初期値を持つ型
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
@implicitNotFound("Cannot add field convert ${Derived}.")
trait Initial[Derived] extends Any {
/**
* 初期値として設定可能なフィールドです。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
type Member
/**
* 設定後に返すべき型です。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
type Result
/**
* 初期値を設定して返します。
*
* @param derived 初期値を持つ値
* @param member 追加する初期値
* @return 初期値を追加した結果
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
def apply(derived: => Derived, member: => this.Member): this.Result
}
/**
* 初期値の追加に関連する機能を定義します。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
object Initial extends AnyRef {
/**
* 追加する型と追加後の型をコンパイル時に取得します。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
@implicitNotFound("Cannot add field of ${Input} convert ${Derived}.")
final type Aux[
Derived,
Input,
Output
] = Initial[Derived] {
type Member = Input
type Result = Output
}
/**
* 現在のスコープに含まれる[[Initial.Aux]]の型クラスインスタンスを取得します。
*
* @param base スコープに含まれる型クラスインスタンス
* @tparam Derived 初期値を持つ型
* @tparam Input 初期値として追加可能な型
* @tparam Output 設定後に返すべき型
* @return スコープに含まれる型クラスインスタンス
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
final def apply[Derived, Input, Output]
(implicit base: this.Aux[Derived, Input, Output]):
this.Aux[Derived, Input, Output] = base
}