Skip to content

Instantly share code, notes, and snippets.

View guizmaii's full-sized avatar
🏄‍♂️

Jules Ivanic guizmaii

🏄‍♂️
View GitHub Profile
@guizmaii
guizmaii / ast.txt
Created December 10, 2018 21:02 — forked from enebo/ast.txt
jruby -S ast -e 'i += 1; i = i + 1'
AST:
RootNode 0
BlockNode 0
LocalAsgnNode:i 0
CallNode:+ 0
LocalVarNode:i 0
ArrayNode 0
FixnumNode 0
, null
@guizmaii
guizmaii / nel_serialize.md
Created December 17, 2018 16:09 — forked from ferhtaydn/nel_serialize.md
How to serialize a model class has NonEmptyList attributes like normal List

How to use NonEmptyList in a model class

Let's say you are implementing an API and decide to return a base error response in common error situations such as BadRequest, NotFound etc.

final case class Error(code: String, description: String)

If you are returning an error response, your assumption would probably be that such responses should contain at least one error.

// Alternative to sealed abstract case class pattern for Scala 2.12.2+
// Benefits:
// - 1 final class instead of 1 sealed class + anonymous subclass
// - portable to Scala 3 regardless of opaque types
// - less boilerplate
final case class Angle private (toDegrees: Int) {
// Define our own `copy` method to suppress synthetic one
// Add private to prevent it from being used
def copy(degrees: Int = toDegrees): Angle = Angle.fromDegrees(degrees)
@guizmaii
guizmaii / latency.markdown
Created January 16, 2019 12:19 — forked from hellerbarde/latency.markdown
Latency numbers every programmer should know

Latency numbers every programmer should know

L1 cache reference ......................... 0.5 ns
Branch mispredict ............................ 5 ns
L2 cache reference ........................... 7 ns
Mutex lock/unlock ........................... 25 ns
Main memory reference ...................... 100 ns             
Compress 1K bytes with Zippy ............. 3,000 ns  =   3 µs
Send 2K bytes over 1 Gbps network ....... 20,000 ns  =  20 µs
SSD random read ........................ 150,000 ns  = 150 µs

Read 1 MB sequentially from memory ..... 250,000 ns = 250 µs

/*
This piece of commented code aims to clarify some
misconceptions between several advanced concepts
in pure functional programming/category theory:
free monads, finally tagless approach, algebraic
effects.
These concepts are actually very close. They rely
on similar concepts and even represent the "same"
object (up to isomorphism!) from the theoretical
2019-03-29 16:46:51
"Ruby-0-Fiber-286" - Thread t@363
java.lang.Thread.State: WAITING
at java.base@11.0.2/jdk.internal.misc.Unsafe.park(Native Method)
- parking to wait for <69439394> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.base@11.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
at java.base@11.0.2/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
at java.base@11.0.2/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361)
at java.base@11.0.2/java.util.concurrent.SynchronousQueue.put(SynchronousQueue.java:873)
2019-03-29 17:33:39
"Ruby-0-Fiber-25" - Thread t@1172
java.lang.Thread.State: WAITING
at java.base@11.0.2/jdk.internal.misc.Unsafe.park(Native Method)
- parking to wait for <4e7da9fc> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.base@11.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
at java.base@11.0.2/java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
at java.base@11.0.2/java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:361)
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.torquebox.mojo.mavengem.wagon.MavenGemWagon.rubygemsFactory(MavenGemWagon.java:88)
at org.torquebox.mojo.mavengem.wagon.MavenGemWagon.newConnection(MavenGemWagon.java:102)
at org.torquebox.mojo.mavengem.wagon.MavenGemWagon.fillInputData(MavenGemWagon.java:64)
at org.apache.maven.wagon.StreamWagon.getInputStream(StreamWagon.java:126)
at org.apache.maven.wagon.StreamWagon.getIfNewer(StreamWagon.java:88)
at org.apache.maven.wagon.StreamWagon.get(StreamWagon.java:61)
at org.eclipse.aether.transport.wagon.WagonTransporter$GetTaskRunner.run(WagonTransporter.java:567)
at org.eclipse.aether.transport.wagon.WagonTransporter.execute(WagonTransporter.java:435)
at org.eclipse.aether.transport.wagon.WagonTransporter.get(WagonTransporter.java:412)
@guizmaii
guizmaii / GroupableOps.scala
Created April 16, 2019 13:22 — forked from fernandomora/GroupableOps.scala
Scala groupMap from 2.13 for scala 2.12
import scala.collection.{immutable, mutable, GenTraversableOnce}
import scala.collection.generic.CanBuildFrom
object GroupableOps {
implicit class ToGroupable[A, Coll[X] <: GenTraversableOnce[X]](coll: Coll[A]) {
// https://github.com/scala/scala/blob/v2.13.0-M5/src/library/scala/collection/Iterable.scala#L578
def groupMap[K, B, To](key: A => K)(f: A => B)
(implicit bf: CanBuildFrom[Coll[A], B, To]): immutable.Map[K, To] = {
@guizmaii
guizmaii / ZioExecSemantic.scala
Created April 22, 2019 21:00 — forked from fanf/ZioExecSemantic.scala
Show how ZIO behave with/without fiber fork.
/*
* This test shows that without a fork, execution is purely mono-fiber and sequential.
*/
object TestZioExecSemantic {
val rt = new DefaultRuntime {}
trait LOG {
def apply(s: String): UIO[Unit]
}
def makeLog = UIO(new LOG {
val zero = System.currentTimeMillis()