org.kynthus.hatalib.argparse.instance.RunInstances0.scala Maven / Gradle / Ivy
The newest version!
package org.kynthus.hatalib.argparse.instance
import org.kynthus.hatalib.core.concept._
import org.kynthus.hatalib.core.syntax.NaturalTransformationSyntax.NaturalTransformationOps
import org.kynthus.hatalib.core.syntax.RunSyntax.TaggedRunOps
import scalaz.syntax.bind.ToBindOps
import scalaz.syntax.tag.ToTagOps
import scalaz.{@@, Bind, Tag, ~>}
import scopt.{OParser, OParserSetup}
import shapeless.ops.hlist.ToTraversable
import shapeless.ops.record.Selector
import shapeless.record.recordOps
import shapeless.{HList, Refute}
import scala.collection.immutable.Queue
import scala.language.higherKinds
/**
* 引数解析を実行するための型クラスインスタンスの第1候補です。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
private[instance] trait RunInstances0 extends Any {
/**
* デフォルトのパーサ動作設定を使用して引数解析を行います。
*
* @param argumentElement コマンドライン引数の要素の型を決定するマーカー
* @param argumentConverter コマンドライン引数の要素の型を[[scala.Predef.String]]へ変換できることを証明する
* @param argumentCategory コマンドライン引数の並びを格納する型を決定するマーカー
* @param runCategory 動作設定を持つ値を格納する型を決定するマーカー
* @param currentSelector 構築後の情報に現在設定中のパーサが存在することを保証する
* @param hierarchySelector 構築後の情報にパーサ階層が存在することを保証する
* @param hierarchyTraversable パーサ階層を[[scala.Traversable]]へ変換できることを保証する
* @param decidedSelector 構築後の情報に決定済みパーサが存在することを保証する
* @param argsSelector 構築後の情報にコマンドライン引数が存在することを保証する
* @param initialSelector パーサの動作設定が既に存在することを保証する
* @param categoryToSeq コマンドライン引数の並びを格納する型から[[scala.Seq]]へ変換できることを保証する
* @param optionToRan [[scala.Option]]からユーザ定義の高階型へ変換できることを保証する
* @param setupNotExist 構築後の情報がパーサの動作設定を保持していないことを保証する
* @tparam Input 現在設定中のパーサのオプションに対応する型
* @tparam Instance 引数解析の結果がマッピングされる型
* @tparam Element コマンドライン引数の要素の型
* @tparam Category コマンドライン引数の並びを格納する型
* @tparam Running 引数解析に必要な情報を保持する型
* @tparam Hierarchy パーサ階層の型
* @tparam Ran ユーザ定義の高階型
* @return デフォルトのパーサ動作設定を使用して引数解析を行う型クラスインスタンス
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
implicit final def DefaultSetupRun[
Input,
Instance,
Element,
Category[_],
Running <: HList,
Hierarchy <: HList,
Ran[_]
](
implicit
argumentElement: ResultElement[Element] @@ Argument.type,
argumentConverter: Converter.Aux[Element, String] @@ Argument.type,
argumentCategory: ResultCategory[Category] @@ Argument.type,
runCategory: ResultCategory[Ran] @@ Run.type,
currentSelector: Selector.Aux[
Running,
ParserCurrent.T,
OParser[Input, Instance]
],
hierarchySelector: Selector.Aux[
Running,
ParserHierarchy.T,
Hierarchy
],
hierarchyTraversable: ToTraversable.Aux[
Hierarchy,
Seq,
OParser[_, Instance]
],
decidedSelector: Selector.Aux[
Running,
ParserDecided.T,
List[Queue[OParser[_, Instance]]]
],
argsSelector: Selector.Aux[
Running,
ArgsRecord.T,
Category[Element]
],
initialSelector: Selector.Aux[
Running,
InitialRecord.T,
Instance
],
categoryToSeq: Category ~> Seq,
optionToRan: Option ~> Ran,
setupNotExist: Refute[
Selector[
Running,
SetupRecord.T
]
]
): Run.Aux[
Running @@ (Input @@ Instance),
Ran[Instance]
] @@ OParser.type = RunInstances0.DefaultSetupRun
/**
* ユーザ定義のパーサ動作設定を使用して引数解析を行います。
*
* @param argumentElement コマンドライン引数の要素の型を決定するマーカー
* @param argumentConverter コマンドライン引数の要素の型を[[scala.Predef.String]]へ変換できることを証明する
* @param argumentCategory コマンドライン引数の並びを格納する型を決定するマーカー
* @param runCategory 動作設定を持つ値を格納する型を決定するマーカー
* @param currentSelector 構築後の情報に現在設定中のパーサが存在することを保証する
* @param hierarchySelector 構築後の情報にパーサ階層が存在することを保証する
* @param hierarchyTraversable パーサ階層を[[scala.Traversable]]へ変換できることを保証する
* @param decidedSelector 構築後の情報に決定済みパーサが存在することを保証する
* @param argsSelector 構築後の情報にコマンドライン引数が存在することを保証する
* @param initialSelector パーサの動作設定が既に存在することを保証する
* @param setupSelector 構築後の情報にユーザ定義のパーサ動作設定が存在することを保証する
* @param categoryToSeq コマンドライン引数の並びを格納する型から[[scala.Seq]]へ変換できることを保証する
* @param optionToRan [[scala.Option]]からユーザ定義の高階型へ変換できることを保証する
* @tparam Input 現在設定中のパーサのオプションに対応する型
* @tparam Instance 引数解析の結果がマッピングされる型
* @tparam Element コマンドライン引数の要素の型
* @tparam Category コマンドライン引数の並びを格納する型
* @tparam Running 引数解析に必要な情報を保持する型
* @tparam Hierarchy パーサ階層の型
* @tparam Ran ユーザ定義の高階型
* @return ユーザ定義のパーサ動作設定を使用して引数解析を行う型クラスインスタンス
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
implicit final def UserSetupRun[
Input,
Instance,
Element,
Category[_],
Running <: HList,
Hierarchy <: HList,
Ran[_]
](
implicit
argumentElement: ResultElement[Element] @@ Argument.type,
argumentConverter: Converter.Aux[Element, String] @@ Argument.type,
argumentCategory: ResultCategory[Category] @@ Argument.type,
runCategory: ResultCategory[Ran] @@ Run.type,
currentSelector: Selector.Aux[
Running,
ParserCurrent.T,
OParser[Input, Instance]
],
hierarchySelector: Selector.Aux[
Running,
ParserHierarchy.T,
Hierarchy
],
hierarchyTraversable: ToTraversable.Aux[
Hierarchy,
Seq,
OParser[_, Instance]
],
decidedSelector: Selector.Aux[
Running,
ParserDecided.T,
List[Queue[OParser[_, Instance]]]
],
argsSelector: Selector.Aux[
Running,
ArgsRecord.T,
Category[Element]
],
initialSelector: Selector.Aux[
Running,
InitialRecord.T,
Instance
],
setupSelector: Selector.Aux[
Running,
SetupRecord.T,
OParserSetup
],
categoryToSeq: Category ~> Seq,
optionToRan: Option ~> Ran
): Run.Aux[
Running @@ (Input @@ Instance),
Ran[Instance]
] @@ OParser.type = RunInstances0.UserSetupRun
/**
* ラップされた型に対して引数解析を行います。
*
* @param argumentElement コマンドライン引数の要素の型を決定するマーカー
* @param argumentConverter コマンドライン引数の要素の型を[[scala.Predef.String]]へ変換できることを証明する
* @param argumentCategory コマンドライン引数の並びを格納する型を決定するマーカー
* @param runCategory 動作設定を持つ値を格納する型を決定するマーカー
* @param bind 平坦化変換が可能なことを保証する
* @param base ラップされた型に対して引数解析が行えることを保証する
* @tparam Instance 引数解析の結果がマッピングされる型
* @tparam Element コマンドライン引数の要素の型
* @tparam Category コマンドライン引数の並びを格納する型
* @tparam Running 引数解析に必要な情報を保持する型
* @tparam Ran ユーザ定義の高階型
* @return ラップされた型に対して引数解析を行う型クラスインスタンス
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
implicit final def CategoryRun[
Instance,
Element,
Category[_],
Running,
Ran[_]
](
implicit
argumentElement: ResultElement[Element] @@ Argument.type,
argumentConverter: Converter.Aux[Element, String] @@ Argument.type,
argumentCategory: ResultCategory[Category] @@ Argument.type,
runCategory: ResultCategory[Ran] @@ Run.type,
bind: Bind[Ran],
base: Run.Aux[
Running,
Ran[Instance]
] @@ OParser.type
): Run.Aux[
Ran[Running],
Ran[Instance]
] @@ OParser.type = RunInstances0.CategoryRun
}
/**
* 引数解析を実行するための型クラスインスタンスの第1候補を内部的に定義します。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
private object RunInstances0 extends AnyRef {
/**
* デフォルトのパーサ動作設定を使用して引数解析を行います(内部)。
*
* @param argumentElement コマンドライン引数の要素の型を決定するマーカー
* @param argumentConverter コマンドライン引数の要素の型を[[scala.Predef.String]]へ変換できることを証明する
* @param argumentCategory コマンドライン引数の並びを格納する型を決定するマーカー
* @param runCategory 動作設定を持つ値を格納する型を決定するマーカー
* @param currentSelector 構築後の情報に現在設定中のパーサが存在することを保証する
* @param hierarchySelector 構築後の情報にパーサ階層が存在することを保証する
* @param hierarchyTraversable パーサ階層を[[scala.Traversable]]へ変換できることを保証する
* @param decidedSelector 構築後の情報に決定済みパーサが存在することを保証する
* @param argsSelector 構築後の情報にコマンドライン引数が存在することを保証する
* @param initialSelector パーサの動作設定が既に存在することを保証する
* @param categoryToSeq コマンドライン引数の並びを格納する型から[[scala.Seq]]へ変換できることを保証する
* @param optionToRan [[scala.Option]]からユーザ定義の高階型へ変換できることを保証する
* @param setupNotExist 構築後の情報がパーサの動作設定を保持していないことを保証する
* @tparam Input 現在設定中のパーサのオプションに対応する型
* @tparam Instance 引数解析の結果がマッピングされる型
* @tparam Element コマンドライン引数の要素の型
* @tparam Category コマンドライン引数の並びを格納する型
* @tparam Running 引数解析に必要な情報を保持する型
* @tparam Hierarchy パーサ階層の型
* @tparam Ran ユーザ定義の高階型
* @return デフォルトのパーサ動作設定を使用して引数解析を行う型クラスインスタンス
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
private final def DefaultSetupRun[
Input,
Instance,
Element,
Category[_],
Running <: HList,
Hierarchy <: HList,
Ran[_]
](
implicit
argumentElement: ResultElement[Element] @@ Argument.type,
argumentConverter: Converter.Aux[Element, String] @@ Argument.type,
argumentCategory: ResultCategory[Category] @@ Argument.type,
runCategory: ResultCategory[Ran] @@ Run.type,
currentSelector: Selector.Aux[
Running,
ParserCurrent.T,
OParser[Input, Instance]
],
hierarchySelector: Selector.Aux[
Running,
ParserHierarchy.T,
Hierarchy
],
hierarchyTraversable: ToTraversable.Aux[
Hierarchy,
Seq,
OParser[_, Instance]
],
decidedSelector: Selector.Aux[
Running,
ParserDecided.T,
List[Queue[OParser[_, Instance]]]
],
argsSelector: Selector.Aux[
Running,
ArgsRecord.T,
Category[Element]
],
initialSelector: Selector.Aux[
Running,
InitialRecord.T,
Instance
],
categoryToSeq: Category ~> Seq,
optionToRan: Option ~> Ran,
setupNotExist: Refute[
Selector[
Running,
SetupRecord.T
]
]
): Run.Aux[
Running @@ (Input @@ Instance),
Ran[Instance]
] @@ OParser.type = Tag {
new Run[Running @@ (Input @@ Instance)] {
/**
* 引数解析の結果得られる型です。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
override type Result = Ran[Instance]
/**
* デフォルトの動作設定を使用して引数解析を行った結果を返します。
*
* @param derived 引数解析に必要な情報を持つ値
* @return 引数解析の結果
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
override def apply
(derived: => Running @@ (Input @@ Instance)):
super.Result = {
// 構築した情報からタグを外す
val running: Running = derived.unwrap
// コマンドライン引数を取得
val elements: Category[Element] = running(ArgsRecord)
// デフォルトの動作設定をもとに引数解析した結果を返す
OParser.parse(
parser = running.toOParser,
args = elements.toArgs,
init = running(InitialRecord)
).transform
}
}
}
/**
* ユーザ定義のパーサ動作設定を使用して引数解析を行います(内部)。
*
* @param argumentElement コマンドライン引数の要素の型を決定するマーカー
* @param argumentConverter コマンドライン引数の要素の型を[[scala.Predef.String]]へ変換できることを証明する
* @param argumentCategory コマンドライン引数の並びを格納する型を決定するマーカー
* @param runCategory 動作設定を持つ値を格納する型を決定するマーカー
* @param currentSelector 構築後の情報に現在設定中のパーサが存在することを保証する
* @param hierarchySelector 構築後の情報にパーサ階層が存在することを保証する
* @param hierarchyTraversable パーサ階層を[[scala.Traversable]]へ変換できることを保証する
* @param decidedSelector 構築後の情報に決定済みパーサが存在することを保証する
* @param argsSelector 構築後の情報にコマンドライン引数が存在することを保証する
* @param initialSelector パーサの動作設定が既に存在することを保証する
* @param setupSelector 構築後の情報にユーザ定義のパーサ動作設定が存在することを保証する
* @param categoryToSeq コマンドライン引数の並びを格納する型から[[scala.Seq]]へ変換できることを保証する
* @param optionToRan [[scala.Option]]からユーザ定義の高階型へ変換できることを保証する
* @tparam Input 現在設定中のパーサのオプションに対応する型
* @tparam Instance 引数解析の結果がマッピングされる型
* @tparam Element コマンドライン引数の要素の型
* @tparam Category コマンドライン引数の並びを格納する型
* @tparam Running 引数解析に必要な情報を保持する型
* @tparam Hierarchy パーサ階層の型
* @tparam Ran ユーザ定義の高階型
* @return ユーザ定義のパーサ動作設定を使用して引数解析を行う型クラスインスタンス
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
private final def UserSetupRun[
Input,
Instance,
Element,
Category[_],
Running <: HList,
Hierarchy <: HList,
Ran[_]
](
implicit
argumentElement: ResultElement[Element] @@ Argument.type,
argumentConverter: Converter.Aux[Element, String] @@ Argument.type,
argumentCategory: ResultCategory[Category] @@ Argument.type,
runCategory: ResultCategory[Ran] @@ Run.type,
currentSelector: Selector.Aux[
Running,
ParserCurrent.T,
OParser[Input, Instance]
],
hierarchySelector: Selector.Aux[
Running,
ParserHierarchy.T,
Hierarchy
],
hierarchyTraversable: ToTraversable.Aux[
Hierarchy,
Seq,
OParser[_, Instance]
],
decidedSelector: Selector.Aux[
Running,
ParserDecided.T,
List[Queue[OParser[_, Instance]]]
],
argsSelector: Selector.Aux[
Running,
ArgsRecord.T,
Category[Element]
],
initialSelector: Selector.Aux[
Running,
InitialRecord.T,
Instance
],
setupSelector: Selector.Aux[
Running,
SetupRecord.T,
OParserSetup
],
categoryToSeq: Category ~> Seq,
optionToRan: Option ~> Ran
): Run.Aux[
Running @@ (Input @@ Instance),
Ran[Instance]
] @@ OParser.type = Tag {
new Run[Running @@ (Input @@ Instance)] {
/**
* 引数解析の結果得られる型です。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
override type Result = Ran[Instance]
/**
* ユーザ定義のパーサの動作設定を使用して引数解析を行った結果を返します。
*
* @param derived 引数解析に必要な情報を持つ値
* @return 引数解析の結果
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
override def apply
(derived: => Running @@ (Input @@ Instance)):
super.Result = {
// 構築した情報からタグを外す
val running: Running = derived.unwrap
// コマンドライン引数を取得
val elements: Category[Element] = running(ArgsRecord)
// ユーザ定義の動作設定をもとに引数解析した結果を返す
OParser.parse(
parser = running.toOParser,
args = elements.toArgs,
init = running(InitialRecord),
setup = running(SetupRecord)
).transform
}
}
}
/**
* ラップされた型に対して引数解析を行います(内部)。
*
* @param argumentElement コマンドライン引数の要素の型を決定するマーカー
* @param argumentConverter コマンドライン引数の要素の型を[[scala.Predef.String]]へ変換できることを証明する
* @param argumentCategory コマンドライン引数の並びを格納する型を決定するマーカー
* @param runCategory 動作設定を持つ値を格納する型を決定するマーカー
* @param bind 平坦化変換が可能なことを保証する
* @param base ラップされた型に対して引数解析が行えることを保証する
* @tparam Instance 引数解析の結果がマッピングされる型
* @tparam Element コマンドライン引数の要素の型
* @tparam Category コマンドライン引数の並びを格納する型
* @tparam Running 引数解析に必要な情報を保持する型
* @tparam Ran ユーザ定義の高階型
* @return ラップされた型に対して引数解析を行う型クラスインスタンス
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
private final def CategoryRun[
Instance,
Element,
Category[_],
Running,
Ran[_]
](
implicit
argumentElement: ResultElement[Element] @@ Argument.type,
argumentConverter: Converter.Aux[Element, String] @@ Argument.type,
argumentCategory: ResultCategory[Category] @@ Argument.type,
runCategory: ResultCategory[Ran] @@ Run.type,
bind: Bind[Ran],
base: Run.Aux[
Running,
Ran[Instance]
] @@ OParser.type
): Run.Aux[
Ran[Running],
Ran[Instance]
] @@ OParser.type = Tag {
new Run[Ran[Running]] {
/**
* 引数解析の結果得られる型です。
*
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
override type Result = Ran[Instance]
/**
* ラップされた型に対して引数解析を行った結果を返します。
*
* @param derived 引数解析に必要な情報を持つ値
* @return 引数解析の結果
* @author Kynthus Auoeau
* @since 1.0.0
* @version 1.0.0
*/
override def apply
(derived: => Ran[Running]):
super.Result = derived >>= (_.run)
}
}
}