Skip to content
View ekwoka's full-sized avatar
🧋
🧋
Block or Report

Block or report ekwoka

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
ekwoka/README.md

Hi, I'm Eric Kwoka

I'm a United States Marine turned Full Stack Engineer!

I'm passionate about solving big problems with little pieces, and contibuting to the ever evolving tech ecosystem.

Some of my packages

The types for the AlpineJS UI reactivity system. I maintain the primary types package as well as the types packages for each of the core plugins.

ESLint plugin that enforces that filenames match to the name of an exported value.

Simple companion package to @tailwindlabs/heroicons with all of the icons as properly typed Preact components!

Some Fun Utilities

A quick and simple implementation of a Weak referenced Least Recently Used Cache, for when you want smart caching in an application that may have a lot of the cached data in use.

A fun exploration of implementing some useful Rust Structs in TypeScript. The main practical use of this library is for Rust-style Iterators (exported as RustIterator) to provide improved streaming computation of values. These were used quite extensively in my 2023 Advent of Code solutions, for the fun of trying to stream solutions from the input, with minimal storage of intermediary values.

This also includes the Monad Structs for Option and Result to improve handling of errors and null values for safety. Getting Monads to work in typescript to work well with some more advanced methods is tricky.

Some Notable Contributions

I am a primary contributor to AlpineJS (not officially associated with the project, but I help out and make a lot of PRs). Some have been pretty nice!

The old way that the Alpine context proxies were merged recreated a lot of the same shaped data for every merge, which happened quite often (every time an expression was evaluated, which is all the time). Not only did this use a lot more memory creating and destroying the same object again and again, doing that takes more processes. This refactors the merge to reuse the same proxy handlers for all merges, as well as simplified the handling of reflections to use more native behaviors that could be offloaded to the runtime.

On top of that, this fixed issues where the merged proxy was difficult to analyze when debugging by properly implementing a toJSON method. Oh, and it short circuited some lookups that would happen often to improve performance (this was for the fairly unknown and uncommon unscopables symbol that was an issue for Alpine's implementation decisions that could really burn a lot of time doing nothing). Pretty significant tackling of performance issues.

Obligatory Stats

Eric's Streak Stats Eric's GitHub Stats Eric's Top Languages

Pinned

  1. advent-of-code advent-of-code Public

    Repo of algorithms for solving Advent of Code challenges

    TypeScript 2

  2. spotify-api spotify-api Public

    A TypeScript Wrapper for the Spotify Web and Playback APIs

    TypeScript 4 2

  3. eslint-plugin-filename-export eslint-plugin-filename-export Public

    ESLint plugin to ensure filenames match a named export

    TypeScript 13 2

  4. Alpine-TS Alpine-TS Public

    Alpine JS, but TS.

    TypeScript 5 1

  5. weak-lru-cache weak-lru-cache Public

    A Least Recently Used Cache that uses Weak References to discard old data

    TypeScript 1