Skip to content
Avatar
🏠
Working from home
🏠
Working from home
Block or Report

Block or report imrafaelmerino

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Add an optional note:
Please don't include any personal information such as legal names or email addresses. Maximum 100 characters, markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
imrafaelmerino/README.md

Hi there 👋, my name is Rafael Merino

I am a functional programmer 👩‍💻

logo

Skills: JAVA / SCALA / CLOJURE / LISP / ERLANG / Functional Programming / Actors

  • 📫 How to reach me: imrafaelmerino@gmail.com
  • 😄 Pronouns: he
  • Fun fact: I was a chess ♔ player. I was the champion 🏆 of Spain 🇪🇸 several times during my childhood.

List of my personal projects 💪 in chronological order and their making-of, sit back and grab 🍿:

json-values

This was my very first project as a functional developer 👏. I learned from Rich Hickey how important persistent data structures are. By the time I started developing json-values, I was working with Json all the time. I really missed a persistent Json and a better API to manipulate them 😡. Developing json-values, I put into practice 🏋️‍ many new concepts for me like recursion, tail-call optimization, trampolines, high order functions, functors, monads, etc.

I started testing 🧪 json-values with a Scala library called ScalaCheck, which is used for property-based testing (PBT). This way, I killed two 🐦 with a stone; I learned a new language, Scala, and an inspiring testing philosophy. I discovered property-based testing thanks to John Hughes and QuickCheck from Haskell. PBT led me to create a beautiful Json generator. I challenged the world, claiming it was the best Json generator in the whole galaxy 🌌 by that time (and still it is!) You can benefit from this Json generator to test your code. Prove me wrong if you have a better alternative!

Spec is an incredible Clojure library. I implemented json-spec based on the ideas I learned from it. At the risk of being presumptuous, I claim it's by far the best way of validating a Json in Java and Scala. It's easy to write, read, and maintain. Defining json generators and specs is a piece of 🍰.

I bought the book 📖 Optics by example, from Chris Penner, written in Haskell. Good read, by the way. I studied Monocle in Scala as well. That allowed me to develop some optics in json-values. Since then, I use optics all the time.

Developing json-values, I started taming effects with FP. I experienced how great FP is describing, composing, and executing programs made up of effectful functions λ. I designed an interactive program that, given a spec, creates a Json asking the user for every value on the console 📺. I also wrote a Json future.

I developed json-values in Scala and Dotty as well. Dotty is a prerelease of Scala3.

Scala is, in my option, a good alternative to do FP in the JVM. I've learned a lot from the Scala community. I have tremendous respect for the Scala creator, Martin Odersky, and the ZIO creator, John A De Goes. I never miss any of their talks and articles.

On the other hand, Clojure is a great choice as well. It's really challenging since it's a lispy programming language. As a Lisp fan, being able to use it in the JVM is incredible. You must see any talk from Rich Hickey. He made a significant impact 👊 on me, and he changed my life entirely as a programmer. Being honest, it took me almost three years of my life to develop json-values and really understand functional programming. The Scala version took me only four months because I had already grasped the fundamentals.

Java doesn't have persistent data structures. Scala and Clojure does. This was a problem implementing the Java version of json-values. I tested a lot of alternatives and compare them in terms of performance and design. I ended up using the persistent data structures from the library vavr.

vertx-effect

Suppose I had to describe vertx-effect in three words. In that case, they'd be without a doubt: expressions, composition, and persistent data structures or values. vertx-effect is the place where actors model meets functional programming in Java.

I couldn't resist naming the most essential function in this library as lambda 😎

I had been working with Vertx for a long time. I always had the feeling that I could do it better 🤷‍♂️. Asynchronous programming is hard. It's even harder if you have to deal with the callback hell 🔥 to do your business logic. Imperative programming doesn't help here.

On the other hand, I started learning Erlang and watching videos of Joe Armstrong. I read his book 📖 and thesis. I really understood the actor model and how powerful it is. I fell in love with failures 🤪. It's critical to know that every system will fail, and you'd better be prepared. Erlang uses persistent data structures, and so does vertx-effect thanks to json-values 👏

I learned from John A De Goes how to use FP to deal with effects. I took the course Principles of Reactive Programming in Scala. The result is vertx-effect. There are some expressions implemented that come from Lisp, like Cond, Case, and IfElse.

It was sad to find out that Joe Armstrong had passed away † in 2019, a few months before I met him. Rest in peace, Joe. I strongly recommend you study his work. He was very brilliant and, at the same time, very kind and humble.

vertx-mongodb-effect

You can model any effect in vertx-effect using lambdas λ. vertx-mondodb-effect gives you some λ to interact with the MongoDB. Going from Json to BSON and vice versa was really cumbersome and tedious. That's why I developed mongo-values, a set of codecs that abstracts you from that.

json-values and mongo-values are ideal for working with MongoDB. mongo-values gives you a set of codecs that free the programmer from doing any kind of conversion to BSON.

jio

JIO is the proof you can do Functional Programming in Java 🕺. Values, expressions, and functions on top of the CompletableFuture API. The IO monad is extremely powerful and allows you to tame any imaginable effect: console programs, HTTP requests, database calls, etc. Everything is composable and referential transparent in the world of lambdas λ and values, which helps you cope with complexity 😌. I think, nowadays (beginning of 2021), there's nothing compared to this in the Java world 🤷‍️.

I implemented a reactive MongoDB client and a reactive HTTP client. I developed some interesting console programs that show the essence of JIO.

It's the first time I used JFR and JMC. I'm glad that since Java 11, we have these tools. Logging is a key aspect of any system.

I fiddled with the fork/join framework that came out in Java 7. I thought you couldn't use it for blocking operations, but that's surprisingly false. The ManagedBlocker interface opens the door to submitting blocking tasks to the pool, and I took advantage 💪 of this in JIO.

Since Mockito and all that stuff are not my cup of tea, I developed a native Java HTTP server to test my HTTP client. Of course! The server is configurable just with functions.

twitter YouTube website

Pinned

  1. json-values Public

    Persistent Json in Java

    HTML 15

122 contributions in the last year

No contributions on Sunday, March 27, 2022 No contributions on Monday, March 28, 2022 No contributions on Tuesday, March 29, 2022 No contributions on Wednesday, March 30, 2022 No contributions on Thursday, March 31, 2022 No contributions on Friday, April 1, 2022 No contributions on Saturday, April 2, 2022 No contributions on Sunday, April 3, 2022 No contributions on Monday, April 4, 2022 No contributions on Tuesday, April 5, 2022 No contributions on Wednesday, April 6, 2022 No contributions on Thursday, April 7, 2022 No contributions on Friday, April 8, 2022 No contributions on Saturday, April 9, 2022 No contributions on Sunday, April 10, 2022 No contributions on Monday, April 11, 2022 4 contributions on Tuesday, April 12, 2022 No contributions on Wednesday, April 13, 2022 No contributions on Thursday, April 14, 2022 No contributions on Friday, April 15, 2022 No contributions on Saturday, April 16, 2022 No contributions on Sunday, April 17, 2022 No contributions on Monday, April 18, 2022 No contributions on Tuesday, April 19, 2022 No contributions on Wednesday, April 20, 2022 No contributions on Thursday, April 21, 2022 No contributions on Friday, April 22, 2022 No contributions on Saturday, April 23, 2022 No contributions on Sunday, April 24, 2022 No contributions on Monday, April 25, 2022 No contributions on Tuesday, April 26, 2022 No contributions on Wednesday, April 27, 2022 2 contributions on Thursday, April 28, 2022 3 contributions on Friday, April 29, 2022 No contributions on Saturday, April 30, 2022 1 contribution on Sunday, May 1, 2022 No contributions on Monday, May 2, 2022 No contributions on Tuesday, May 3, 2022 No contributions on Wednesday, May 4, 2022 No contributions on Thursday, May 5, 2022 No contributions on Friday, May 6, 2022 No contributions on Saturday, May 7, 2022 No contributions on Sunday, May 8, 2022 No contributions on Monday, May 9, 2022 1 contribution on Tuesday, May 10, 2022 No contributions on Wednesday, May 11, 2022 No contributions on Thursday, May 12, 2022 1 contribution on Friday, May 13, 2022 No contributions on Saturday, May 14, 2022 No contributions on Sunday, May 15, 2022 No contributions on Monday, May 16, 2022 2 contributions on Tuesday, May 17, 2022 No contributions on Wednesday, May 18, 2022 No contributions on Thursday, May 19, 2022 4 contributions on Friday, May 20, 2022 2 contributions on Saturday, May 21, 2022 1 contribution on Sunday, May 22, 2022 No contributions on Monday, May 23, 2022 2 contributions on Tuesday, May 24, 2022 2 contributions on Wednesday, May 25, 2022 9 contributions on Thursday, May 26, 2022 2 contributions on Friday, May 27, 2022 No contributions on Saturday, May 28, 2022 No contributions on Sunday, May 29, 2022 No contributions on Monday, May 30, 2022 No contributions on Tuesday, May 31, 2022 2 contributions on Wednesday, June 1, 2022 No contributions on Thursday, June 2, 2022 5 contributions on Friday, June 3, 2022 2 contributions on Saturday, June 4, 2022 No contributions on Sunday, June 5, 2022 1 contribution on Monday, June 6, 2022 2 contributions on Tuesday, June 7, 2022 No contributions on Wednesday, June 8, 2022 1 contribution on Thursday, June 9, 2022 No contributions on Friday, June 10, 2022 No contributions on Saturday, June 11, 2022 No contributions on Sunday, June 12, 2022 6 contributions on Monday, June 13, 2022 No contributions on Tuesday, June 14, 2022 5 contributions on Wednesday, June 15, 2022 1 contribution on Thursday, June 16, 2022 2 contributions on Friday, June 17, 2022 1 contribution on Saturday, June 18, 2022 No contributions on Sunday, June 19, 2022 No contributions on Monday, June 20, 2022 5 contributions on Tuesday, June 21, 2022 5 contributions on Wednesday, June 22, 2022 7 contributions on Thursday, June 23, 2022 No contributions on Friday, June 24, 2022 1 contribution on Saturday, June 25, 2022 1 contribution on Sunday, June 26, 2022 No contributions on Monday, June 27, 2022 No contributions on Tuesday, June 28, 2022 No contributions on Wednesday, June 29, 2022 No contributions on Thursday, June 30, 2022 No contributions on Friday, July 1, 2022 No contributions on Saturday, July 2, 2022 No contributions on Sunday, July 3, 2022 No contributions on Monday, July 4, 2022 No contributions on Tuesday, July 5, 2022 No contributions on Wednesday, July 6, 2022 No contributions on Thursday, July 7, 2022 No contributions on Friday, July 8, 2022 2 contributions on Saturday, July 9, 2022 No contributions on Sunday, July 10, 2022 3 contributions on Monday, July 11, 2022 1 contribution on Tuesday, July 12, 2022 No contributions on Wednesday, July 13, 2022 No contributions on Thursday, July 14, 2022 No contributions on Friday, July 15, 2022 No contributions on Saturday, July 16, 2022 No contributions on Sunday, July 17, 2022 No contributions on Monday, July 18, 2022 No contributions on Tuesday, July 19, 2022 No contributions on Wednesday, July 20, 2022 No contributions on Thursday, July 21, 2022 No contributions on Friday, July 22, 2022 No contributions on Saturday, July 23, 2022 No contributions on Sunday, July 24, 2022 No contributions on Monday, July 25, 2022 No contributions on Tuesday, July 26, 2022 No contributions on Wednesday, July 27, 2022 No contributions on Thursday, July 28, 2022 No contributions on Friday, July 29, 2022 No contributions on Saturday, July 30, 2022 No contributions on Sunday, July 31, 2022 No contributions on Monday, August 1, 2022 No contributions on Tuesday, August 2, 2022 No contributions on Wednesday, August 3, 2022 No contributions on Thursday, August 4, 2022 No contributions on Friday, August 5, 2022 No contributions on Saturday, August 6, 2022 No contributions on Sunday, August 7, 2022 2 contributions on Monday, August 8, 2022 No contributions on Tuesday, August 9, 2022 No contributions on Wednesday, August 10, 2022 No contributions on Thursday, August 11, 2022 No contributions on Friday, August 12, 2022 No contributions on Saturday, August 13, 2022 No contributions on Sunday, August 14, 2022 No contributions on Monday, August 15, 2022 No contributions on Tuesday, August 16, 2022 No contributions on Wednesday, August 17, 2022 No contributions on Thursday, August 18, 2022 No contributions on Friday, August 19, 2022 No contributions on Saturday, August 20, 2022 2 contributions on Sunday, August 21, 2022 5 contributions on Monday, August 22, 2022 No contributions on Tuesday, August 23, 2022 No contributions on Wednesday, August 24, 2022 5 contributions on Thursday, August 25, 2022 4 contributions on Friday, August 26, 2022 No contributions on Saturday, August 27, 2022 No contributions on Sunday, August 28, 2022 No contributions on Monday, August 29, 2022 No contributions on Tuesday, August 30, 2022 No contributions on Wednesday, August 31, 2022 No contributions on Thursday, September 1, 2022 No contributions on Friday, September 2, 2022 No contributions on Saturday, September 3, 2022 No contributions on Sunday, September 4, 2022 No contributions on Monday, September 5, 2022 No contributions on Tuesday, September 6, 2022 No contributions on Wednesday, September 7, 2022 No contributions on Thursday, September 8, 2022 No contributions on Friday, September 9, 2022 No contributions on Saturday, September 10, 2022 No contributions on Sunday, September 11, 2022 No contributions on Monday, September 12, 2022 No contributions on Tuesday, September 13, 2022 No contributions on Wednesday, September 14, 2022 No contributions on Thursday, September 15, 2022 No contributions on Friday, September 16, 2022 No contributions on Saturday, September 17, 2022 No contributions on Sunday, September 18, 2022 No contributions on Monday, September 19, 2022 No contributions on Tuesday, September 20, 2022 No contributions on Wednesday, September 21, 2022 No contributions on Thursday, September 22, 2022 No contributions on Friday, September 23, 2022 No contributions on Saturday, September 24, 2022 No contributions on Sunday, September 25, 2022 No contributions on Monday, September 26, 2022 No contributions on Tuesday, September 27, 2022 No contributions on Wednesday, September 28, 2022 No contributions on Thursday, September 29, 2022 No contributions on Friday, September 30, 2022 No contributions on Saturday, October 1, 2022 No contributions on Sunday, October 2, 2022 No contributions on Monday, October 3, 2022 No contributions on Tuesday, October 4, 2022 No contributions on Wednesday, October 5, 2022 No contributions on Thursday, October 6, 2022 No contributions on Friday, October 7, 2022 No contributions on Saturday, October 8, 2022 No contributions on Sunday, October 9, 2022 No contributions on Monday, October 10, 2022 No contributions on Tuesday, October 11, 2022 No contributions on Wednesday, October 12, 2022 No contributions on Thursday, October 13, 2022 No contributions on Friday, October 14, 2022 No contributions on Saturday, October 15, 2022 No contributions on Sunday, October 16, 2022 No contributions on Monday, October 17, 2022 No contributions on Tuesday, October 18, 2022 No contributions on Wednesday, October 19, 2022 No contributions on Thursday, October 20, 2022 No contributions on Friday, October 21, 2022 No contributions on Saturday, October 22, 2022 No contributions on Sunday, October 23, 2022 No contributions on Monday, October 24, 2022 No contributions on Tuesday, October 25, 2022 No contributions on Wednesday, October 26, 2022 No contributions on Thursday, October 27, 2022 No contributions on Friday, October 28, 2022 No contributions on Saturday, October 29, 2022 No contributions on Sunday, October 30, 2022 No contributions on Monday, October 31, 2022 No contributions on Tuesday, November 1, 2022 No contributions on Wednesday, November 2, 2022 No contributions on Thursday, November 3, 2022 No contributions on Friday, November 4, 2022 No contributions on Saturday, November 5, 2022 No contributions on Sunday, November 6, 2022 No contributions on Monday, November 7, 2022 No contributions on Tuesday, November 8, 2022 No contributions on Wednesday, November 9, 2022 No contributions on Thursday, November 10, 2022 No contributions on Friday, November 11, 2022 No contributions on Saturday, November 12, 2022 No contributions on Sunday, November 13, 2022 No contributions on Monday, November 14, 2022 No contributions on Tuesday, November 15, 2022 No contributions on Wednesday, November 16, 2022 No contributions on Thursday, November 17, 2022 No contributions on Friday, November 18, 2022 No contributions on Saturday, November 19, 2022 No contributions on Sunday, November 20, 2022 No contributions on Monday, November 21, 2022 No contributions on Tuesday, November 22, 2022 No contributions on Wednesday, November 23, 2022 No contributions on Thursday, November 24, 2022 No contributions on Friday, November 25, 2022 No contributions on Saturday, November 26, 2022 No contributions on Sunday, November 27, 2022 No contributions on Monday, November 28, 2022 No contributions on Tuesday, November 29, 2022 No contributions on Wednesday, November 30, 2022 No contributions on Thursday, December 1, 2022 No contributions on Friday, December 2, 2022 No contributions on Saturday, December 3, 2022 No contributions on Sunday, December 4, 2022 No contributions on Monday, December 5, 2022 No contributions on Tuesday, December 6, 2022 No contributions on Wednesday, December 7, 2022 No contributions on Thursday, December 8, 2022 No contributions on Friday, December 9, 2022 No contributions on Saturday, December 10, 2022 No contributions on Sunday, December 11, 2022 No contributions on Monday, December 12, 2022 No contributions on Tuesday, December 13, 2022 No contributions on Wednesday, December 14, 2022 No contributions on Thursday, December 15, 2022 No contributions on Friday, December 16, 2022 No contributions on Saturday, December 17, 2022 No contributions on Sunday, December 18, 2022 No contributions on Monday, December 19, 2022 No contributions on Tuesday, December 20, 2022 No contributions on Wednesday, December 21, 2022 No contributions on Thursday, December 22, 2022 No contributions on Friday, December 23, 2022 No contributions on Saturday, December 24, 2022 No contributions on Sunday, December 25, 2022 No contributions on Monday, December 26, 2022 No contributions on Tuesday, December 27, 2022 No contributions on Wednesday, December 28, 2022 No contributions on Thursday, December 29, 2022 No contributions on Friday, December 30, 2022 No contributions on Saturday, December 31, 2022 No contributions on Sunday, January 1, 2023 No contributions on Monday, January 2, 2023 No contributions on Tuesday, January 3, 2023 No contributions on Wednesday, January 4, 2023 No contributions on Thursday, January 5, 2023 No contributions on Friday, January 6, 2023 No contributions on Saturday, January 7, 2023 No contributions on Sunday, January 8, 2023 No contributions on Monday, January 9, 2023 No contributions on Tuesday, January 10, 2023 No contributions on Wednesday, January 11, 2023 No contributions on Thursday, January 12, 2023 No contributions on Friday, January 13, 2023 No contributions on Saturday, January 14, 2023 No contributions on Sunday, January 15, 2023 No contributions on Monday, January 16, 2023 No contributions on Tuesday, January 17, 2023 No contributions on Wednesday, January 18, 2023 No contributions on Thursday, January 19, 2023 No contributions on Friday, January 20, 2023 No contributions on Saturday, January 21, 2023 No contributions on Sunday, January 22, 2023 No contributions on Monday, January 23, 2023 No contributions on Tuesday, January 24, 2023 No contributions on Wednesday, January 25, 2023 No contributions on Thursday, January 26, 2023 No contributions on Friday, January 27, 2023 No contributions on Saturday, January 28, 2023 No contributions on Sunday, January 29, 2023 No contributions on Monday, January 30, 2023 No contributions on Tuesday, January 31, 2023 No contributions on Wednesday, February 1, 2023 No contributions on Thursday, February 2, 2023 No contributions on Friday, February 3, 2023 No contributions on Saturday, February 4, 2023 1 contribution on Sunday, February 5, 2023 1 contribution on Monday, February 6, 2023 No contributions on Tuesday, February 7, 2023 No contributions on Wednesday, February 8, 2023 6 contributions on Thursday, February 9, 2023 2 contributions on Friday, February 10, 2023 No contributions on Saturday, February 11, 2023 No contributions on Sunday, February 12, 2023 3 contributions on Monday, February 13, 2023 No contributions on Tuesday, February 14, 2023 No contributions on Wednesday, February 15, 2023 1 contribution on Thursday, February 16, 2023 No contributions on Friday, February 17, 2023 No contributions on Saturday, February 18, 2023 No contributions on Sunday, February 19, 2023 No contributions on Monday, February 20, 2023 No contributions on Tuesday, February 21, 2023 No contributions on Wednesday, February 22, 2023 No contributions on Thursday, February 23, 2023 No contributions on Friday, February 24, 2023 No contributions on Saturday, February 25, 2023 No contributions on Sunday, February 26, 2023 No contributions on Monday, February 27, 2023 No contributions on Tuesday, February 28, 2023 No contributions on Wednesday, March 1, 2023 No contributions on Thursday, March 2, 2023 No contributions on Friday, March 3, 2023 No contributions on Saturday, March 4, 2023 No contributions on Sunday, March 5, 2023 No contributions on Monday, March 6, 2023 No contributions on Tuesday, March 7, 2023 No contributions on Wednesday, March 8, 2023 No contributions on Thursday, March 9, 2023 No contributions on Friday, March 10, 2023 No contributions on Saturday, March 11, 2023 No contributions on Sunday, March 12, 2023 No contributions on Monday, March 13, 2023 No contributions on Tuesday, March 14, 2023 No contributions on Wednesday, March 15, 2023 No contributions on Thursday, March 16, 2023 No contributions on Friday, March 17, 2023 No contributions on Saturday, March 18, 2023 No contributions on Sunday, March 19, 2023 No contributions on Monday, March 20, 2023 No contributions on Tuesday, March 21, 2023 No contributions on Wednesday, March 22, 2023 No contributions on Thursday, March 23, 2023 No contributions on Friday, March 24, 2023 No contributions on Saturday, March 25, 2023 No contributions on Sunday, March 26, 2023 No contributions on Monday, March 27, 2023 1 contribution on Tuesday, March 28, 2023 No contributions on Wednesday, March 29, 2023 Apr May Jun Jul Aug Sep Oct Nov Dec Jan Feb Mar Mon Wed Fri

Contribution activity

March 2023

Created 1 repository

Seeing something unexpected? Take a look at the GitHub profile guide.