Skip to content

Instantly share code, notes, and snippets.

@gakuzzzz
gakuzzzz / 0_.md
Last active May 14, 2021
YAVI に Applicative な Validation 入れるよの話
View 0_.md

https://github.com/making/yavi/pull/121

  • Validator に (validateToEither と同様な) validateToAp みたいなのを作らず ApplicativeValidator を別に用意したのは何故なんでしょう?
    • validateToValidation みたいな謎な名前になってしまうから?
  • ApplicativeBuilder的な ComposingN があるので FunctionNcurried を持たせなくても良さそうですね(実装は泥臭くなりますがオブジェクト生成数を抑制できます)
    • 逆にカリー化できる関数があると ComposingN のようなものを不要にできたりもします。
    • とは言えYAVIのユースケースだと Validator からメソッドチェーンで使うのが主だと思うので、ComposingN の方が有用そうですね。
    • 完全に余談ですが、カリー化できる FunctionN を別途定義するより、curried を static メソッドにすると curried(Foo::bar) みたいな使い方が可能になるので個人的にはそちらの方がお勧めです。(Functions 的な1クラスのoverloadですませられますし)
  • Validation<E, >applyValidation<List<E>, > を返すのがびっくりしますね。Applicative の挙動を期待するなら型としては Validation<E, > になるので。
    • YAVI の利用範囲から考えると、エラーの集約方法を汎用化する必要もなさそうなので、error は最初から List に決め打ちしちゃってもいいかもしれません。以下のようなイメージです。
@gakuzzzz
gakuzzzz / 0_readme.md
Last active Nov 29, 2020
Java Stream API で foldLeft/foldRight その2
View 0_readme.md

Java Stream API で foldLeft/foldRight で宿題にした StackOverflow しない実装の一例です。

面白ポイントとしては、foldRight/foldLeft の実装差分は Function::compose/Function::andThenEndo::compose/Endo::andThen に変わっただけ、という所ですね。

(注意)ただしこれは不変な List の concat を Stream を使って実装しているため、非常に遅いです。 高速な実装については読者への宿題とします。

@gakuzzzz
gakuzzzz / _0.md
Last active Sep 17, 2020
LinkedHashMapの初期化
View _0.md
@gakuzzzz
gakuzzzz / _0.md
Last active May 15, 2021
https://twitter.com/matarillo/status/1302048512771645440 フラットなデータ集合からネストしたグルーピングするのに foldMap が便利だよというお話
View _0.md

前提

こちらのツイート https://twitter.com/matarillo/status/1302048512771645440 をみて foldMap か foldLeft で簡単に書けるのでは?と思ったのが発端

データ構造がこんな感じだとして

  case class OrganizationRecord(
    id: Long,
    organizationLv1: String,
@gakuzzzz
gakuzzzz / 0_.md
Created Jul 6, 2020
Scala variance sample
View 0_.md
class Foo[+A]
class Bar[-A]

class Test1[A] {
  def piyo(a: A): Unit = ???      // OK
  def poyo(a: Foo[A]): Unit = ??? // OK
  def puyo(a: Bar[A]): Unit = ??? // OK
}
class Test2[+A] {
@gakuzzzz
gakuzzzz / 0_.md
Last active May 31, 2020
Doma2 Criteria API with Immutable entity.
View 0_.md

associateの例 を Immutable Entity でどうするか

1:1:N ぐらいなら collect で何とでもなる

    Employee_ e = new Employee_();
    Task_ t = new Task_();
    Address_ a = new Address_();

    Map<Employee, Tuple2<List<Task>, Optional<Address>>> result = nativeql
@gakuzzzz
gakuzzzz / FutureEitherTxBoundary.scala
Last active May 22, 2020
FutureEitherTxBoundary.scala
View FutureEitherTxBoundary.scala
object Sample {
implicit def futureEitherTxBoundary[A, B](implicit ec: ExecutionContext): TxBoundary[Future[Either[A, B]]] = new TxBoundary[Future[Either[A, B]]] {
def finishTx(result: Future[Either[A, B]], tx: Tx): Future[Either[A, B]] = {
onFinishTx(result) {
case Success(Right(_)) => tx.commit()
case Success(Left(_)) => tx.rollback()
case Failure(_) => tx.rollback()
}
@gakuzzzz
gakuzzzz / 0_.md
Last active Aug 15, 2019
ScalikeJDBC の Batch API に ParameterBinderFactory をかますためのヘルパー的なやつ
View 0_.md

利用シーン

val emps: Seq[Emp] = ...
val column = Emp.column
val (placeholders, batchParams) = createBatchParams {
  emps.map { emp =>
    Seq(
      column.id   -> emp.id,
      column.name -> emp.name
@gakuzzzz
gakuzzzz / 0.md
Last active Apr 2, 2019
EnumReverseLookup
View 0.md

共通コード

public class EnumReverseLookup<E extends Enum<E>, ATTR> {

    private final Class<E> enumClass;
    private final Function<E, ATTR> getter;

    public EnumReverseLookup(final Class<E> enumClass, final Function<E, ATTR> getter) {
        this.enumClass = enumClass;
View MyBiFunc.java
package jp.t2v.lab;
import java.util.function.Function;
@FunctionalInterface
public interface MyBiFunc<T, U, R> extends Function<T, Function<U, R>> {
@Override
default Function<U, R> apply(T t) {
return u -> apply(t, u);