Skip to content
View imrafaelmerino's full-sized 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.

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 identify as both a programmer 👩‍💻 and a problem solver. The moments of struggle in solving a problem make me feel like the most miserable person in the world. Conversely, the joy of successfully overcoming a challenge doesn't make me the happiest person 🤷; instead, I simply move on to the next challenge!

logo

  • 📫 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.

Sit back and grab some popcorn 🍿 as I take you through a chronological journey of my personal projects 💪:

This marked my initiation into the realm of functional programming 👏. Inspired by Rich Hickey and his emphasis on persistent data structures, I embarked on creating json-values. Constantly immersed in JSON-related tasks, I felt the need for a persistent Json structure and a more robust API for manipulation 😡. The development of json-values became a playground for new concepts such as recursion, tail-call optimization, trampolines, high-order functions, functors, and monads.

Testing 🧪 was a crucial aspect, and I explored the world of property-based testing (PBT) using the Scala library ScalaCheck. This not only introduced me to a new language but also exposed me to a testing philosophy inspired by John Hughes and Haskell's QuickCheck. The outcome? A JSON generator I proudly claimed to be the best in the galaxy 🌌, a challenge to which the world could respond with a better alternative!

Spec, an incredible Clojure library, inspired me to create json-spec, a validation approach I consider the best for Java and Scala. The process of defining JSON generators and specs became a piece of 🍰. Additionally, I ventured into developing the fastest JSON parser/validator in the JAVA ecosystem, adopting a novel approach of interleaving parsing and validation for optimal performance.

My journey took me to the realm of optics through the book 📖 Optics by example by Chris Penner, written in Haskell. Studying Monocle in Scala allowed me to incorporate optics into json-values. Since then, optics have become an integral part of my toolkit.

While the initial development of json-values occurred in Scala for the sheer joy of it, I recognized the need for dual versions:

The absence of persistent data structures in Java led me to explore and compare alternatives for performance and design, ultimately choosing the vavr library.


In the Vert.x ecosystem, JSON message transmission is a prevalent practice, but challenges arise when using of the native JsonObject or JsonArray types from Jackson due to the need for creating copies, impacting performance and straining the Garbage Collector. vertx-values steps in as a solution, leveraging the json-values framework to enable the transmission of immutable JSON objects. vertx-values aims to significantly enhance the efficiency of JSON message transmission within Vert.x applications.


json-values and mongo-values form the perfect duo for seamless MongoDB interactions. With mongo-values, programmers are liberated from manual BSON conversions, thanks to a set of codecs that operate with exceptional speed. The process is streamlined – JSON is serialized and transmitted over the wire, and vice versa for deserialization, eliminating the need for intermediate conversions. This not only enhances performance but also simplifies the MongoDB workflow for developers.


With the widespread popularity of Kafka, I opted to seamlessly integrate the json-values spec with Avro, and the outcome is fantastic! avro-spec empowers you to create Avro schemas and serializers/deserializers with the specs from json-values. Leveraging the simplicity, intuitiveness, and composability of creating specs allows you to efficiently define Avro schemas. The provided serializers/deserializers enable the transmission of the immutable and persistent JSON from json-values through the wire.


vertx-effect in a Nutshell: The Fusion of Actors Model and Functional Programming in Java

With an extensive background in Vertx, a persistent belief in doing better 🤷‍♂️ fueled my journey. Asynchronous programming poses challenges, amplified in the daunting landscape of callback hell 🔥 for business logic. Imperative programming falls short, and while virtual threads are a boon, they don't enhance program resilience. The crux lies in treating errors not as exceptions but as normal data.

My revelation came while exploring Erlang and immersing myself in Joe Armstrong's teachings through his book 📖 and thesis. The actor model's potency, coupled with an appreciation for embracing failures 🤪, profoundly impacted vertx-effect, enriched by persistent data structures from json-values 👏.

Inspired by John A De Goes, I embraced functional programming to tackle effects, drawing insights from the Principles of Reactive Programming in Scala course. The resultant creation, vertx-effect, incorporates expressions like CondExp, SwitchExp, and IfElseExp from * Lisp*.

A poignant note: The untimely passing † of Joe Armstrong in 2019 was a somber moment. His brilliance, humility, and kindness continue to resonate through his enduring work, encouraging all to delve into and appreciate his profound legacy.


You can express any effect in vertx-effect using Lambdas. With vertx-mongodb-effect, you gain access to convenient Lambdas for seamless interaction with MongoDB, harnessing the power of mongo-values and json-values.


JIO stands as a testament that Functional Programming in Java is more than just possible 🕺. It seamlessly integrates values, expressions, and functions into the CompletableFuture API. The prowess of the IO monad unfolds, offering unparalleled capabilities to harness a spectrum of effects, be it console programs, HTTP requests, or database calls. The world of lambdas and values within JIO is inherently composable and referentially transparent, providing a robust framework to navigate complexity 😌. In the realm of Java, there seems to be nothing quite like it 🤷‍️. JIO's expressive features are a tour de force in addressing complexity, and handling retries with diverse policies becomes a straightforward task.

In my journey with JIO, I crafted a reactive MongoDB client and an agile HTTP client. I delved into developing intriguing console programs that illuminate the core of JIO's capabilities.

Experimenting with the fork/join framework introduced in Java 7, I discovered that contrary to popular belief, it indeed accommodates blocking operations. The ManagedBlocker interface served as the gateway to submit blocking tasks to the pool, a capability I wholeheartedly embraced 💪 in JIO.

Steering away from frameworks like Mockito, I engineered a native Java HTTP server to thoroughly test my HTTP client. Remarkably, the server is entirely configurable using functions. Moreover, leveraging virtual threads allows seamless conversion of any code into the JIO API. The jio-test module further amplifies JIO's strength, enabling powerful property-based testing. Rest assured, it's an effective tool for uncovering bugs in your code!


The primary objective of java-fun is to bring essential Functional Programming (FP) patterns to the Java ecosystem. Unlike mere translations of these patterns from other languages, java-fun is designed with the intent that any typical Java developer can effortlessly embrace and comprehend these concepts. The emphasis is on preserving the essence of these patterns, ensuring developers do not become entangled in unfamiliar types and conventions.

Here are the key concepts that have been thoughtfully implemented within java-fun:

  • Pseudo Random Generators: Property-Based Testing is a highly effective testing approach, and having a robust set of generators that can be composed in countless ways is crucial. java-fun simplifies this process, making it incredibly straightforward.

  • Optics: In functional programming, optics take precedence over traditional getters and setters. They offer safety and composability, eliminating the likelihood of encountering NullPointerExceptions when used correctly.

  • Tuples: Although Java may not officially support tuples, they remain exceptionally valuable. java-fun introduces tuples with arities of two and three, encompassing pairs and triples, respectively. These structures enhance code expressiveness and maintainability.


"An étude (a French word meaning study) is an instrumental musical composition, usually short, of considerable difficulty, and designed to provide practice material for perfecting a particular musical skill." — Wikipedia

This project contains javatudes—Java programs, usually short, for perfecting particular programming skills.

Admittedly, this idea isn't original; I borrowed it from Peter Norvig's Github repository. I simply swapped Java for Python :)

Discover my Java solutions to the captivating Advent of Code. Dive into a plethora of puzzles and algorithms, each meticulously solved without reliance on any external library. It's all about honing skills, practicing, and, of course, having a great deal of fun along the way!

Pinned

  1. json-values json-values Public

    Persistent Json in Java

    Java 20

  2. vertx-values vertx-values Public

    Codecs to be able to send to the Vert.x Event Bus the immutable and persistent JSON from json-values

    Java 8

  3. java-fun java-fun Public

    Functional programming techniques implemented in Java

    Java 3

  4. JIO JIO Public

    API to work with functional effects in Java

    Java 1

  5. avro-spec avro-spec Public

    The library offers a set of builders and utilities to construct Avro schemas from specs and provides serializers and deserializers tailored to these schemas to transmit the immutable and persistent…

    Java

  6. mongo-values mongo-values Public

    Set of codecs to add support for json-values in the java mongo driver.

    Java 1