GithubHelp home page GithubHelp logo

eed3si9n / sbt-boilerplate Goto Github PK

View Code? Open in Web Editor NEW

This project forked from sbt/sbt-boilerplate

0.0 3.0 0.0 53 KB

sbt plugin for generating scala.Tuple/Function related boilerplate code

License: BSD 2-Clause "Simplified" License

Scala 100.00%

sbt-boilerplate's Introduction

sbt-boilerplate

Boilerplate is an sbt-plugin that generates stubs for code which has to be expanded for all numbers of arguments from 1 to 22. This is sometimes necessary to support all of the TupleX or FunctionX generically.

The plugin defines a simple template language for this purpose.

The template language

The template file contains mostly literal code with some control characters guiding the expansion. Expansion follows these rules:

  • The current number of arguments i is initialized to 22.
  • Code embraced in [# and #] is copied i times and the expansion is applied recursively with i being set accordingly.
    • It is possible to define a custom separator between the copied instances by putting the separator text between the # and the ] of the closing bracket. If no separator is supplied ", " is assumed.
    • You can specify a custom range i should iterate through by placing a term of the form <start>..<end> between the starting [ and # of an expansion. Either start or end can be omitted in which case the defaults are assumed.
  • Everywhere digit 1 is replaced by i, digit 0 is replaced by i - 1, and digit 2 is replaced by i + 1 unless the digit is prefixed with ##.
  • To encode the sharp '#' character precede it with a backslash e.g. "\#".

Examples

Apply function to tuple

Consider the task is to provide overloads for a function which can apply a function to a tuple for all numbers of arguments from 1 to 22.

Start by writing out the function for only one argument:

def applyFunc[P1, R](input: Tuple1[P1], func: (P1) => R): R =
  func(input._1)

For the function to be copied for each possible number of arguments, enclose it in [# and #] (the newline between the closing # and ] defines that instances should be separated by newline and not by the default ", "):

[#def applyFunc[P1, R](input: Tuple1[P1], func: (P1) => R): R =
  func(input._1)#
]

This will already expand to:

def applyFunc[P1, R](input: Tuple1[P1], func: (P1) => R): R =
  func(input._1)
def applyFunc[P2, R](input: Tuple2[P2], func: (P2) => R): R =
  func(input._2)
def applyFunc[P3, R](input: Tuple3[P3], func: (P3) => R): R =
  func(input._3)
def applyFunc[P4, R](input: Tuple4[P4], func: (P4) => R): R =
  func(input._4)
// ...

This is not yet what we want, because we P1 to expand to P1, P2, ..., Pi and input._1 to input._1, input._2, ..., input._i. So we embrace the parts to expand another time:

[#def applyFunc[[#P1#], R](input: Tuple1[[#P1#]], func: ([#P1#]) => R): R =
  func([#input._1#])#
]

This now expands correctly to

def applyFunc[P1, R](input: Tuple1[P1], func: (P1) => R): R =
  func(input._1)
def applyFunc[P1, P2, R](input: Tuple2[P1, P2], func: (P1, P2) => R): R =
  func(input._1, input._2)
def applyFunc[P1, P2, P3, R](input: Tuple3[P1, P2, P3], func: (P1, P2, P3) => R): R =
  func(input._1, input._2, input._3)
def applyFunc[P1, P2, P3, P4, R](input: Tuple4[P1, P2, P3, P4], func: (P1, P2, P3, P4) => R): R =
  func(input._1, input._2, input._3, input._4)

Usage

Put

addSbtPlugin("io.spray" % "sbt-boilerplate" % "0.6.0")

into your plugins.sbt. sbt-boilerplate is an AutoPlugin which needs to be enabled using

enablePlugins(spray.boilerplate.BoilerplatePlugin)

The templates have to be put into the src/main/boilerplate directory and the file name must end with .template. The generated files will be put into the same hierarchy as they appear in src/main/boilerplate with the .template extension stripped off. If the stripped filename has no extension ".scala" is added automatically.

Known issues

  • Instances for zero arguments have to be supplied manually.

Projects using sbt-boilerplate

License

Copyright (c) 2012-2016 Johannes Rudolph

Published under the BSD 2-Clause License.

sbt-boilerplate's People

Contributors

jrudolph avatar marklister avatar nrinaudo avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.