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

parsley.lift.scala Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2020 Parsley Contributors 
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */
package parsley

import parsley.Parsley.pure
import parsley.ap._ // scalastyle:ignore underscore.import

import parsley.internal.deepembedding.frontend

/** This module contains `lift1` through `lift22`, which allow for the application of a function of arity `N` to `N` parsers.
  *
  * The combinators contained in this module all sequence a number of parsers together, but are capable of combining the
  * results generated by these parsers into a single value with a given function of the correct arity. This is a clean
  * way of putting together multiple parsers and getting a meaningful result out.
  *
  * @example {{{
  * scala> import parsley.character.char
  * scala> import parsley.lift.{lift2, lift3}
  * scala> case class Add(x: Int, y: Int)
  * scala> val p = lift2(Add, char('a').as(4), char('b').as(5))
  * scala> p.parse("ab")
  * val res0 = Success(Add(4, 5))
  * scala> val q = lift3((x: Int, y: Int, z: Int) => x * y + z, char('a').as(3), char('b').as(2), char('c').as(5))
  * scala> q.parse("abc")
  * val res1 = Success(11)
  * scala> q.parse("ab")
  * val res2 = Failure(..)
  * scala> val q2 = lift3[Int, Int, Int, Int](_ * _ + _, char('a').as(3), char('b').as(2), char('c').as(5))
  * }}}
  * @since 2.2.0
  *
  * @define body
  *     This combinator applies the given parsers in sequence and then applies the given function `f` of to all of the results.
  *
  *     Firstly, each parser is parsed in turn, each producing a result. So long as all of the parsers succeeded,
  *     the combinator can succeed by returning the application of the function `f` to all the arguments. If any
  *     of the parsers fails, the entire combinator fails.
  *
  * @define param a function to apply to the results of the parsers with arity
  * @define return a parser that parses all of the given parsers in order, and then combines their results with `f`.
  */
object lift {
    // scalastyle:off parameter.number ensure.single.space.after.token
    /** This combinator allows the result of a given parser to be changed using a given function.
      *
      * Effectively alias for `map`, to be consistent with the other `lift` variants.
      *
      * @param f the function to map across the given parser
      * @return a parser that applies the function `f` to the result of the given parser.
      */
    def lift1[T1, R]
        (f: T1 => R,
         p1: Parsley[T1]): Parsley[R] =
        p1.map(f)
    /** $body
      *
      * @param f $param two.
      * @return $return
      */
    def lift2[T1, T2, R]
        (f: (T1, T2) => R,
         p1: Parsley[T1], p2: =>Parsley[T2]): Parsley[R] =
        new Parsley(new frontend.Lift2(f, p1.internal, p2.internal))
    /** $body
      *
      * @param f $param three.
      * @return $return
      */
    def lift3[T1, T2, T3, R]
        (f: (T1, T2, T3) => R,
         p1: Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3]): Parsley[R] =
        new Parsley(new frontend.Lift3(f, p1.internal, p2.internal, p3.internal))
    // $COVERAGE-OFF$
    /** $body
      *
      * @param f $param four.
      * @return $return
      */
    def lift4[T1, T2, T3, T4, R]
        (f: (T1, T2, T3, T4) => R,
         p1: Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4]): Parsley[R] =
        ap4(pure(f), p1, p2, p3, p4)
    /** $body
      *
      * @param f $param five.
      * @return $return
      */
    def lift5[T1, T2, T3, T4, T5, R]
        (f: (T1, T2, T3, T4, T5) => R,
         p1: Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5]): Parsley[R] =
        ap5(pure(f), p1, p2, p3, p4, p5)
    /** $body
      *
      * @param f $param six.
      * @return $return
      */
    def lift6[T1, T2, T3, T4, T5, T6, R]
        (f: (T1, T2, T3, T4, T5, T6) => R,
         p1: Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6]): Parsley[R] =
        ap6(pure(f), p1, p2, p3, p4, p5, p6)
    /** $body
      *
      * @param f $param seven.
      * @return $return
      */
    def lift7[T1, T2, T3, T4, T5, T6, T7, R]
        (f: (T1, T2, T3, T4, T5, T6, T7) => R,
         p1: Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7]): Parsley[R] =
        ap7(pure(f), p1, p2, p3, p4, p5, p6, p7)
    /** $body
      *
      * @param f $param eight.
      * @return $return
      */
    def lift8[T1, T2, T3, T4, T5, T6, T7, T8, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7],
         p8: =>Parsley[T8]): Parsley[R] =
        ap8(pure(f), p1, p2, p3, p4, p5, p6, p7, p8)
    /** $body
      *
      * @param f $param nine.
      * @return $return
      */
    def lift9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9]): Parsley[R] =
        ap9(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9)
    /** $body
      *
      * @param f $param ten.
      * @return $return
      */
    def lift10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10]): Parsley[R] =
        ap10(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)
    /** $body
      *
      * @param f $param eleven.
      * @return $return
      */
    def lift11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11]): Parsley[R] =
        ap11(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)
    /** $body
      *
      * @param f $param twelve.
      * @return $return
      */
    def lift12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12]): Parsley[R] =
        ap12(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)
    /** $body
      *
      * @param f $param thirteen.
      * @return $return
      */
    def lift13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13]): Parsley[R] =
        ap13(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)
    /** $body
      *
      * @param f $param fourteen.
      * @return $return
      */
    def lift14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13], p14: =>Parsley[T14]): Parsley[R] =
        ap14(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)
    /** $body
      *
      * @param f $param fifteen.
      * @return $return
      */
    def lift15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13], p14: =>Parsley[T14],
         p15: =>Parsley[T15]): Parsley[R] =
        ap15(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)
    /** $body
      *
      * @param f $param sixteen.
      * @return $return
      */
    def lift16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13], p14: =>Parsley[T14], p15: =>Parsley[T15],
         p16: =>Parsley[T16]):
        Parsley[R] = ap16(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)
    /** $body
      *
      * @param f $param seventeen.
      * @return $return
      */
    def lift17[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13], p14: =>Parsley[T14], p15: =>Parsley[T15],
         p16: =>Parsley[T16], p17: =>Parsley[T17]): Parsley[R] =
        ap17(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)
    /** $body
      *
      * @param f $param eighteen.
      * @return $return
      */
    def lift18[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13], p14: =>Parsley[T14], p15: =>Parsley[T15],
         p16: =>Parsley[T16], p17: =>Parsley[T17], p18: =>Parsley[T18]): Parsley[R] =
        ap18(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)
    /** $body
      *
      * @param f $param nineteen.
      * @return $return
      */
    def lift19[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13], p14: =>Parsley[T14], p15: =>Parsley[T15],
         p16: =>Parsley[T16], p17: =>Parsley[T17], p18: =>Parsley[T18], p19: =>Parsley[T19]): Parsley[R] =
        ap19(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)
    /** $body
      *
      * @param f $param twenty.
      * @return $return
      */
    def lift20[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13], p14: =>Parsley[T14], p15: =>Parsley[T15],
         p16: =>Parsley[T16], p17: =>Parsley[T17], p18: =>Parsley[T18], p19: =>Parsley[T19], p20: =>Parsley[T20]): Parsley[R] =
        ap20(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)
    /** $body
      *
      * @param f $param twenty-one.
      * @return $return
      */
    def lift21[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13], p14: =>Parsley[T14], p15: =>Parsley[T15],
         p16: =>Parsley[T16], p17: =>Parsley[T17], p18: =>Parsley[T18], p19: =>Parsley[T19], p20: =>Parsley[T20], p21: =>Parsley[T21]): Parsley[R] =
        ap21(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21)
    // $COVERAGE-ON$
    /** $body
      *
      * @param f $param twenty-two.
      * @return $return
      */
    def lift22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, R]
        (f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) => R,
         p1:   Parsley[T1], p2: =>Parsley[T2], p3: =>Parsley[T3], p4: =>Parsley[T4], p5: =>Parsley[T5], p6: =>Parsley[T6], p7: =>Parsley[T7], p8: =>Parsley[T8],
         p9: =>Parsley[T9], p10: =>Parsley[T10], p11: =>Parsley[T11], p12: =>Parsley[T12], p13: =>Parsley[T13], p14: =>Parsley[T14], p15: =>Parsley[T15],
         p16: =>Parsley[T16], p17: =>Parsley[T17], p18: =>Parsley[T18], p19: =>Parsley[T19], p20: =>Parsley[T20], p21: =>Parsley[T21],
         p22: =>Parsley[T22]): Parsley[R] =
        ap22(pure(f), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22)
    // scalastyle:on parameter.number ensure.single.space.after.token
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy