juan_gandhi: (Default)
2025-05-03 05:51 pm
Entry tags:

minimalistic cache

isFinite tells us whether we can cache it; maybe it's coming from a predicate that checks the size, or something.


class Cache[K,V](isFinite: Boolean, build: K => V):
  private val cache: mutable.Map[K, V] = mutable.Map[K, V]()

  private val app: K => V = if (isFinite) (k: K) => cache.getOrElseUpdate(k, build(k)) else (k: K) => build(k)
  
  inline def apply(k: K): V = app(k)

juan_gandhi: (Default)
2025-03-05 02:02 pm
Entry tags:

а я-то думал

Всё мне не нравится, что тесты на мой категорный код идут часа чуть ли не два. Науськал наконец на неё кводану (Qodana) - типа вот, найдут дефекты перформанса. И вот что я утром вижу:

No problems detected

                                                                   The  found no issues. 


Придётся вручную изучать вопрос. Но на самом деле больше вопросов с зависимыми типами.

juan_gandhi: (Default)
2025-02-11 07:44 am
Entry tags:

scala 3.6.1, 3.6.2

 Затрахался последние дни с проблемами компиляции - добавишь что-нибудь в trait, а компилятор бац - и несёт какую-то херню. Собрался уже вырезать кусочек и послать им багрепорт. Погуглил. Ха, в 3.6.1 баги. А вот 3.6;2 уже вроде бы не рушит компиляцию.

Ну посмотрим, посмотрим. А то сидишь такой рефакторишь, и тут бац - не связанные с этим классом классы перестают компилироваться.

Тьфу.

juan_gandhi: (Default)
2024-07-11 08:57 am
Entry tags:

A couple of Scala links

Kit Langton, NeoType - a good enhancement of Scala3's opaque types
Scalag - a Scala library for GPU


juan_gandhi: (Default)
2023-03-10 10:28 am
Entry tags:

жизнь собачия

 Карен нашла там у меня смешной дефект в коде, что я послал на ревью. Спасибо ей; дефект поправил.

Теперь что. Добавил тесткейс.

Упс. Компилятор кирдык. scalac. Зацикливается.

Окей. Закомментировал пока большую часть того кейса.

Упс. Другие тесты не идут. А чо? А-а--а-а-а! Вставил запятую.

Вот что это вообще.

Настанет, наверно, момент, что я завяжу со скалой. Там какие-то ебанаты. Сейчас пошел очередной скандал, там какая-то дура, "заведующая скальной комьюнити", образование у нее - политология, из белградского университета, решила Джона де Гоуза не допускать в качестве спикера (или вообще?) на конференции. (Ну, к Джону главная претензия - что он лысый и мускулистый: не иначе расист.) Другого Джона (Прити) вообще выпинали отовсюду, потому что гелфренда одного левого экстремиста из Берлина нажаловалась публично, что ранее Джон Прити с ней трахался (а жениться не захотел).

Какая хуйня, прости господи. Надо вернуться на Форт, там дедушки мирные, все улыбаются (и я их почти что в лицо знаю, а уж по сорс-коду так точно, читал как стихи когда-то). Тоже маразм, конечно.

 

juan_gandhi: (Default)
2023-01-28 02:27 pm
Entry tags:

I'm convinced

My first chat with chatGPT.
I'm convinced.


 
juan_gandhi: (Default)
2022-11-21 08:21 pm
Entry tags:

(no subject)

object Pathos {
val firsts =
"авто,агро,апо,арахно,аристо,астро,аэро,био,бюро,вело,гастро,гео,гербо,геронто,герпето,гетеро,гидро,гипер,гипно,гомео,гомо,графо,демо,дендро,зоо,изо,ихтио,како,квази,клепто,крипто,мегало,метро,микро,моно,мото,невро,нейтро,некро,неонато,нимфо,олиго,опто,орто,орфо,охло,панто,пара,пато,парто,педо,пиро,плуто,поли,прото,психо,птеро,ретро,тео,топо,физио,фило,фито,фото,шизо,экзо,эко,эндо,энцефало,эпи".split(",").toList
val seconds = "арх,граф,крат,лог,ман,мах,метр,ном,пат,пед,соф,тон,топ,фил,фоб,фон,френ".split(",").toList

val isEndVowel = "аеоуэюя".toSet
val isVowel = "аеиоуэюя".toSet

def word(first: String, second: String) =
if (isVowel(second.head) && isEndVowel(first.last))
first.dropRight(1) + second else first + second

val header =
s"<td/>${seconds map (w => s"<th>&nbsp;$w&nbsp;</th>") mkString ""}"

def row(f: String) =
s"<th aligh=left>&nbsp;$f&nbsp;</th>${seconds map (s => s"<td style='text-align:center'>&nbsp;${word(f,s)}ия&nbsp;</td>") mkString ""}"

val content = (header :: (firsts map row)).mkString("<tr>", "</tr>\n<tr>", "</tr>\n")

def main(args: Array[String]): Unit = {
println(s"<table>$content</table>")
println("<br/>")
println(firsts map(f => s"${f}сексуализм") mkString(", "))
}
}

juan_gandhi: (Default)
2022-11-13 06:34 pm
Entry tags:

slapped together a scala functor

 which is applicative but not a monad (solution from stackoverflow)

link

juan_gandhi: (Default)
2022-02-23 09:31 am
Entry tags:

zio http

Talk by Tushar. I'm not embedding it, please go there, watch and applaud.
juan_gandhi: (Default)
2022-01-31 08:01 am
Entry tags:

here's a better transformer version

 gist
class Test extends AnyFlatSpec with Matchers {
"transformer" should "work" in {
// source: https://contributors.scala-lang.org/t/ability-to-force-the-caller-to-specify-a-type-parameter-for-a-polymorphic-method/2116/26
sealed trait NotNothing[-T]

object NotNothing {
@implicitAmbiguous("inst() method needs a generic parameter type, which is missing")
implicit val nothingIsNothing = new NotNothing[Nothing]{}
implicit def notNothing[T] = new NotNothing[T] {}
}

implicit class Transformer(source: String) {
def as[T : NotNothing : ClassTag] = {
import scala.reflect._
val cls: Class[T] = classTag[T].runtimeClass.asInstanceOf[Class[T]]
val cons: Constructor[T] = cls.getDeclaredConstructor(classOf[String])
cons.newInstance(source)
}
}

val a0 = "good A".as[A]
val b0 = "good B".as[B]
a0.getClass shouldBe classOf[A]
b0.getClass shouldBe classOf[B]
a0.toString shouldBe "A(good A)"
b0.toString shouldBe "B(good B)"
}
}

class Base
case class A(val s: String) extends Base
case class B(val s: String) extends Base

juan_gandhi: (Default)
2022-01-30 10:37 am
Entry tags:

тонкая фигня со скальной рефлексией

Ну вот мы хотим такую абстрактную фабрику зафигачить,

def inst[T](s: String)(implicit tag: ClassTag[T]): T = {
val cls = tag.runtimeClass
val cons = cls.getDeclaredConstructor(classOf[String])
cons.newInstance(s).asInstanceOf[T]
}

Мол, возьми строку и проинстанциируй тип, какой тебе дадут. Такого конструктора может и не быть, но здесь просто примерчик.
А штука в том, что вот нарисуем мы юзкейсы,

class A(val s: String) extends Zero
class B(val s: String) extends Zero
val a1: A = inst("anA")
val b1: B = inst("aB")

- и чо? Скомпилируется, а рантайм не пойдет - в строке, где мы конструктор ищем, выяснится, что класс у нас Nothing - упс!

Ну, Nothing - это инициальный объект; скала не нашла, какой там ClassTag подсунуть, и подсовывает ClassTag инициального.

Ну хорошо, хорошо, давайте подымемся по иерархии, и станем проверять параметр типа:

def inst[T >: Null](s: String)(implicit tag: ClassTag[T]): T = {
val cls = tag.runtimeClass
val cons = cls.getDeclaredConstructor(classOf[String])
cons.newInstance(s).asInstanceOf[T]
}

А хрен вам, опять в рантайме обломится. Потому что Null можно присваивать хоть кому (спасибо Хору).

Ну ладно, Null никто не подставляет. Запрещать имеет смысл только дефолтный Nothing.

Вот как это делается:

sealed trait NotNothing[-T]

object NotNothing {
@implicitAmbiguous("Method needs a generic parameter type, which is missing")
implicit val nothingIsNothing = new NotNothing[Nothing]{}
implicit def notNothing[T] = new NotNothing[T] {}
}

И затем пишем

def inst[T : NotNothing : ClassTag](s: String): T = {
import scala.reflect._
val cls: Class[T] = classTag[T].runtimeClass.asInstanceOf[Class[T]]
val cons: Constructor[T] = cls.getDeclaredConstructor(classOf[String])
cons.newInstance(s)
}

В результате компиляции

val a0 = inst[A]("good A")
val a1:A = inst("ana")
val b1:B = inst("ab")
видим

/Users/vpatryshev/projects/test/Test.scala:185:20
inst() method needs a generic parameter type, which is missing
val a1:A = inst("ana")


 
Чего и добивались.

juan_gandhi: (Default)
2021-06-16 08:25 am
Entry tags:

my funny old code

package scalakittens

/**
* A trait that describes a goodness of data or outcome or something
*
* Created by vpatryshev on 10/18/15.
*/
trait Goodness:
def isGood: Boolean
def isBad: Boolean = !isGood

trait PositiveAttitude extends Goodness { def isGood = true }
trait NegativeAttitude extends Goodness { def isGood = false}
juan_gandhi: (Default)
2021-06-10 05:15 pm
Entry tags:

не могу объяснить, но

У меня есть набор тестов с топосной логикой; там расчеты довольно тяжелые; часа 2 с лишним уходило.

Переключился сейчас со скалы 2.12 на скалу 2.13, и jvm с 7 на 11.

В два раза быстрее. 

juan_gandhi: (Default)
2021-06-03 08:57 am
Entry tags:

Scala: Free, back with a vengeance

That's about free profunctors casually dropping into the code

 https://www.youtube.com/watch?v=2yRtxYbV1h4