All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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)

    }

  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy