Skip to content

Instantly share code, notes, and snippets.

View gakuzzzz's full-sized avatar

Manabu Nakamura gakuzzzz

View GitHub Profile
@gakuzzzz
gakuzzzz / 0_.md
Last active May 20, 2021 10:32
YAVI に Applicative な Validation 入れるよの話

making/yavi#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 November 29, 2020 09:20
Java Stream API で foldLeft/foldRight その2

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

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

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

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

前提

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

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

  case class OrganizationRecord(
    id: Long,
    organizationLv1: String,
@gakuzzzz
gakuzzzz / 0_.md
Last active November 16, 2022 03:12
Scala variance sample
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

 def paya(): A = ??? // OK
@gakuzzzz
gakuzzzz / 0_.md
Last active May 31, 2020 07:19
Doma2 Criteria API with Immutable entity.

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

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

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

 Map, Optional&gt;&gt; result = nativeql
@gakuzzzz
gakuzzzz / FutureEitherTxBoundary.scala
Last active May 22, 2020 02:19
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 August 15, 2019 01:23
ScalikeJDBC の Batch API に ParameterBinderFactory をかますためのヘルパー的なやつ

利用シーン

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 July 23, 2022 01:52
EnumReverseLookup

共通コード

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;
@gakuzzzz
gakuzzzz / MyBiFunc.java
Last active January 28, 2019 12:31
MyBiFunc
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);