Skip to content

Instantly share code, notes, and snippets.

View gakuzzzz's full-sized avatar

Manabu Nakamura gakuzzzz

View GitHub Profile
@gakuzzzz
gakuzzzz / action-function.md
Last active April 6, 2023 01:47
ActionFunction の紹介 - Play framework Advent Calendar 2014 7日目

ActionFunction の紹介

この記事は Play framework Advent Calendar 2014 の7日目です。

昨日は @dorako321 さんの Play framework Advent Calendar 2014 6日目 位置情報を使ってみよう でした。

明日は @nazoking さんの play2.3 の sbt-web を使わず node で代替システムを作るための資料 です。

さて、そんなこんなで公式ドキュメントではまだ語られていない ActionFunction とそのサブトレイトについて紹介したいと思います。 (公式ドキュメントにも記載ありました https://www.playframework.com/documentation/2.3.x/ScalaActionsComposition#Different-request-types )

@gakuzzzz
gakuzzzz / 0_diff.scala
Last active August 29, 2015 14:10
文字列比較
@annotation.tailrec
def diff(s1: Seq[Char], s2: Seq[Char], acc: StringBuilder = new StringBuilder()): String = {
(s1, s2) match {
case (Nil , Nil) => acc.toString
case (x +: _ , Nil) => acc.append(s"[$x][$$END$$]").toString
case (Nil , y +: _) => acc.append(s"[$$END$$][$y]").toString
case (x +: xs, y +: ys) if x == y => diff(xs, ys, acc.append(x))
case (x +: _ , y +: _) => acc.append(s"[$x][$y]").toString
}
}
@gakuzzzz
gakuzzzz / ActionBuilderZipper .scala
Last active August 29, 2015 14:09
ActionBuilderZipper
import play.api.mvc._
import scala.concurrent.Future
case class ZippedRequest[A, R1[_] <: Request[_], R2[_] <: Request[_]](_1: R1[A], _2: R2[A]) extends WrappedRequest[A](_1.asInstanceOf[Request[A]])
object ActionBuilderZipper {
private def zip[R1[_] <: Request[_], R2[_] <: Request[_]](b1: ActionBuilder[R1], b2: ActionBuilder[R2]): ActionBuilder[({type L[A] = ZippedRequest[A, R1, R2]})#L] = {
new ActionBuilder[({type L[A] = ZippedRequest[A, R1, R2]})#L] {
@gakuzzzz
gakuzzzz / slide.md
Last active June 11, 2019 01:59
パターンマッチいろいろ (函数型なんたらの集い 2014 in Tokyo)

パターンマッチいろいろ

  • 2014/10/25 函数型なんたらの集い 2014 in Tokyo
  • @gakuzzzz
  • 中村 学
  • 株式会社Tech to Value
  • Scalaから来ました

参加の経緯

@gakuzzzz
gakuzzzz / _.scala
Created August 25, 2014 07:51
method to function
scala> def add(a: Int, b: Int): Int = a + b
add: (a: Int, b: Int)Int
scala> add(_)
<console>:9: error: missing parameter type for expanded function ((x$1) => add(x$1))
add(_)
^
<console>:9: error: not enough arguments for method add: (a: Int, b: Int)Int.
Unspecified value parameter b.
add(_)
@gakuzzzz
gakuzzzz / 1_Implicits.scala
Last active April 18, 2021 02:29
Play2 Controller Utilities
package controllers.util
import play.api.mvc.{Result, Controller}
import play.api.data.Form
import scala.util.Either.RightProjection
object Implicits {
implicit def formToEither[A](form: Form[A]): Either[Form[A], A] = form.fold(Left.apply, Right.apply)
@gakuzzzz
gakuzzzz / tx.scala
Last active August 29, 2015 14:04
ScalikeTx
import scalikejdbc._
case class Tx[+A] private (underlying: DBSession => A) {
def apply(s: DBSession): A = underlying(s)
def map[B](f: A => B): Tx[B] = Tx(underlying andThen f)
def flatMap[B](f: A => Tx[B]): Tx[B] = Tx(s => f(underlying(s))(s))
@gakuzzzz
gakuzzzz / pole2.hs
Last active August 29, 2015 14:04
pole2
import Control.Monad.State
type Birds = Int
type Pole = (Birds, Birds)
landLeft' :: Birds -> Pole -> Either Pole Pole
landLeft' n (left, right)
| abs ((left + n) - right) < 4 = Right (left + n, right)
| otherwise = Left (left + n, right)
@gakuzzzz
gakuzzzz / foo.scala
Last active August 29, 2015 14:04
ifExists
val (u, g) = (User.syntax("u"), Group.syntax("g"))
val groupId: Option[GroupId] = ...
// getOrElse
sql"""
SELECT
${u.result.*}
${groupId.map(v => sqls", ${g.result.name}") getOrElse sqls""}
FROM
${User as u}
@gakuzzzz
gakuzzzz / gist:0149504e99a371974539
Last active August 29, 2015 14:04
validation dsl

spec

  • 氏名は必須
  • メアドはオプショナル
    • だけど入力されていたら簡易な正規表現でチェック
  • 開始日と終了日は必須
    • 開始日 < 終了日 である必要がある
  • 全てのバリデーションが通ったら Subscription(name: String, mail: Option[String], interval: Interval) というオブジェクトにする
  • 氏名とメアドと開始日と終了日のvalidationはどれががこけても全て実施して全てのエラーを返す必要がある