about summary refs log tree commit diff
AgeCommit message (Collapse)AuthorFilesLines
2020-08-20 Support parsing second shiftsWilliam Carroll5-0/+125
Parse inputs like -10s into 10 second shifts back in time.
2020-08-20 Support POST /create-payment-intentWilliam Carroll7-5/+118
Interact with Stripe's payment_intents API endpoint. I'm not committing the index.html that contains client-side code that interacts with the /create-payment-intent endpoint, but it contains sensitive information, so I'm omitting it for now. TL;DR: - Define POST /create-payment-intent endpoint - Include envStripeAPIKey in Context record - Define a top-level Stripe module for making API calls - Define types and instances that align with Stripes request and response types - Depend on the Req library: a higher-level library than http-client
2020-08-13 Prefer project.el to projectileWilliam Carroll2-1/+42
Today @tazjin told me about Emacs's built-in project.el library, which he recommended that I extend to support monorepo-specific tooling. It worked like a charm! Now when I press "<leader>f", it will resolve to either the nearest file named default.nix or directory name .git.
2020-08-13 Set Emacs current-project to ~/briefcaseWilliam Carroll1-1/+1
I don't rely on this often, so it's best to leave it as the top-level directory for briefcase.
2020-08-13 Document ghcExtensions argumentWilliam Carroll1-3/+3
Missed documenting this the first time...
2020-08-12 Consume buildHaskell functionsWilliam Carroll3-57/+45
Use the newly defined `buildHaskell` function for a few of my existing Haskell projects. So far, it works as intended!
2020-08-12 Support buildHaskellWilliam Carroll2-9/+41
Use Nix and Briefcase to easily create Haskell executables. I'd eventually like to support something like: briefcase.buildHaskell.project that let me define a few top-level values (e.g. ghcExtensions) and would give me a ghci environment with the proper `.ghci` settings so that my development environment mirrored my build environment... baby steps, though.
2020-08-12 Define alias for cd-ing to ~/briefcaseWilliam Carroll1-3/+13
Small but useful alias.
2020-08-12 Prefer snake-shift instead of a row-by-row shiftWilliam Carroll5-37/+57
Per the assignment's instructions, the `Shift n` operation should treat the *entire keyboard* like a cycle and shift that. I was erroneously treating *each row* like a cycle and shifting those one-by-one. This change fixes that. In addition, it also: - Updates README.md with expected inputs and outputs - Updates test suite - Adds `split` dependency to {default,shell}.nix
2020-08-12 Adds property tests to generically test keyboard transformationsWilliam Carroll1-1/+25
Tests: - HorizontalFlip - VerticalFlip - Shift n
2020-08-12 Prefer literal, not computed, examples in the unit testsWilliam Carroll1-21/+19
TL:DR: - Remove unused imports: Test.QuickCheck and Control.Exception - Remove calls to `reverse` and `Utils.rotate` with their results
2020-08-12 Provide more useful instructions for building this projectWilliam Carroll3-18/+67
TL;DR: - include a default.nix to allow users to build an named executable - emphasize in the README that the user needs Nix to build this project - pin nixpkgs to a specific commit and fetch it from GitHub
2020-08-12 Generate coords function from existing qwerty keyboardWilliam Carroll1-44/+8
Per my take-home assignment's reviewer's comments, with which for the record I agree, I should generate the character->coordinate table from my existing qwerty keyboard definition. The best part is: by doing this I found a bug: Notice how the original '0' character was mapped to the Coordinate (0,0)... thus every subsequent digit key (i.e. the first row) is off-by-one.
2020-08-10 Drop support for ServantT transformer type for serverWilliam Carroll3-16/+59
After burning a few hours wrestling with the type system, I decided to revert to the simpler `Server API` type instead of the `ServantT` transformer type. The problem is that I couldn't write a MonadError instance for `RIO Context`, which is my `AppM` (i.e. application monad). Using `throwIO` in the server handlers results in 500 errors, which is not what I wanted. I'm still pretty fuzzy about what's happening; I now know that exception handling in Haskell is pretty gnaryly. I may revisit this at a later time when my knowledge is more extensive. For now: time to fry bigger fish. An easier abstract is for me to pass `T.Context` into `server` as an argument, which after all is what a Reader does. TL;DR: - Read server, client ports from .envrc - Define a top-level Failure type (empty for now) - Define a top-level Success type - Define App as RIO Context (Either Failure Success)
2020-08-09 Prefer ServantT for server to consume App contextWilliam Carroll2-24/+33
Long story -> short: I'd like to access my App monad from within my Servant handlers. While this code type-checks, I'm not sure it's working as intended. Needing to change throwError to throwIO fails the "smell test". I expect to refactor this code, but I'm calling it a night for now.
2020-08-09 Replace Prelude with RIOWilliam Carroll7-39/+95
I believe RIO stands for: "ReaderT <something-something> IO", which is a nod to the top-level application data type: ```haskell -- This is a simplification newtype RIO env a = RIO { runRIO :: ReaderT env a () } ``` I read about RIO from an FP-Complete blog post a few months ago, and now I'm excited to try it out for a real project. Bon voyage!
2020-08-09 Move Haskell-related shell.nix code into its own shell.nixWilliam Carroll2-11/+19
I'm getting tired of: ```shell $ cd <project-root> $ nix-shell $ cd src/server $ ghci Main.hs ``` Instead: ```shell $ cd <project-root>/src/server $ ghci Main.hs ```
2020-08-09 Sketch database schemaWilliam Carroll1-0/+41
Defining a few tables in init.sql to sketch a few records that I need to persist.
2020-08-09 Initialize a default.nix for nix-buildWilliam Carroll1-0/+27
As the previous commit mentions, I'm attempting to build and deploy this project with `nix-shell` and `nix-build` instead of `cabal` and `stack`. I'm in the Hamburg airport right now, and my internet connection isn't stable enough to test this, so I'm committing it until I can more robustly test it.
2020-08-09 Add common language extensions to .ghciWilliam Carroll6-9/+5
I'd like to see if I can avoid using `cabal` and `stack` and build and deploy this application using `nix-shell` and `nix-build` only. Let's see how that goes.
2020-08-08 Consume GoogleSignIn.validateJWTWilliam Carroll4-26/+60
TL;DR: - Consume GoogleSignIn.validateJWT in the Handler for /verify - Rename validation fn to validateJWT - Prefer Text to String type
2020-08-08 Add tests for "exp" field of the JWTWilliam Carroll4-13/+61
Assert that the exp field of the JWT is "fresh".
2020-08-08 Test that the JWT's iss field meets our expectationsWilliam Carroll3-9/+42
The JWT should match "accounts.google.com" or "https://accounts.google.com". If it doesn't, we produce a validation error. TL;DR: - Group all failed stringOrURI function calls as StringOrURIParseFailure errors
2020-08-08 Test that an improperly encoded JWT returns a DecodeErrorWilliam Carroll1-0/+3
The subject of this commit message says it all.
2020-08-08 Tests valid and invalid JWTs for the "aud" fieldWilliam Carroll4-21/+87
Test that when the JWT contains the client ID for my Google app, the JWT is valid, and when it doesn't, it's invalid.
2020-08-08 Update jwtIsValid API to return IO BoolWilliam Carroll2-6/+6
I need IO for: - Getting the current time to validate `exp` - Making an HTTP request to Google's token verifier endpoint
2020-08-08 Remove redundant deps from API.hsWilliam Carroll1-2/+0
Thank you, -Wall. You are truly an unsung hero.
2020-08-08 Begin work for supporting GoogleSignIn server-sideWilliam Carroll4-5/+92
I'm attempting to be an obedient boy and implement this and future features using TDD. TL;DR: - Defined a few tests - Defined an empty GoogleSignIn module - Defined a Fixtures module to quickly create JWTs to test
2020-08-08 Define Utils moduleWilliam Carroll1-0/+8
Dumping grounds for personal, stylistic functions intended to improve readabily and writability (in that order).
2020-08-06 Support echo server to test POST /verifyWilliam Carroll5-8/+79
TL;DR: - Add common dependencies like Servant, Aeson, Warp, Cors - Define a POST /verify endpoint for our client to hit - POST to /verify client-side onSignIn
2020-08-06 Support Google Sign-in client-sideWilliam Carroll5-1/+53
TODO: Support Google Sign-in server-side Also: - Add Haskell to project's shell.nix - Add stubbed Main.hs and Spec.hs - Add common .ghci file
2020-08-06 Re-type type using the altered keyboardWilliam Carroll5-7/+129
Remember: always read the instructions; that's the most important part.
2020-08-06 Support Transforms.optimizeWilliam Carroll2-0/+19
Partially optimize inputs and document rules for further optimizations we can make.
2020-08-05 Apply a series of transformation to a QWERTY keyboardWilliam Carroll4-32/+51
TL;DR: - Accept input from the CLI - Add a project README.md
2020-08-05 Support App.transformWilliam Carroll5-1/+57
Apply the transform to a Keyboard. Onwards to the final demonstration!
2020-08-05 Support parsing the list of transformsWilliam Carroll2-7/+65
Using Haskell's Text.ParserCombinators.ReadP library for the first time, and I enjoyed it thoroughly! It's nice avoiding a third-party library like MegaParsec.
2020-08-05 Define an instance for Show for a KeyboardWilliam Carroll1-0/+23
This will help me debug.
2020-08-05 Create a Utils moduleWilliam Carroll1-0/+8
To stylize things...
2020-08-05 Add some the scaffolding for testingWilliam Carroll2-0/+20
As I attempt to habituate TDD, I should have some examples of tests to minimize all friction preventing me from testing.
2020-08-04 Include instructions for building Tailwind CSS in README.mdWilliam Carroll1-0/+1
After consuming my Elm boilerplate, I realized that I was missing this.
2020-08-04 Create small command line program that parses argumentsWilliam Carroll3-0/+56
Before starting my take-home assignment, the instructions advised me to create a "Hello, world" program in the language of my choice. Since I'm choosing Haskell, I created this example as my starter boilerplate.
2020-07-30 Mark Dangal as watchedWilliam Carroll2-1/+1
Many Bollywood movies have excellent acting, excellent directing, excellent storytelling, but in my opinion, they spoil this with unnecessary musicals interspersed throughout the films. Dangal is a notable exception here. Overall, I'd say that this movie is appropriately rated!
2020-07-30 Mark Hitchcock's Vertigo as watchedWilliam Carroll2-1/+1
Watched the famous "Vertigo" with the timeless Jimmy Stewart. Overall I'd say that the film is overhyped, but worth watching nevertheless.
2020-07-26 Watch "Hacksaw Ridge"William Carroll2-1/+1
I don't plan on writing movie reviews in my Git commit message.
2020-07-26 Add query for the productive directorsWilliam Carroll1-0/+15
Show the movies from directors that appear more than once in the list.
2020-07-26 Create a scratch buffer for common queriesWilliam Carroll1-0/+50
Defining some commonly used criteria for selecting movies as SQL queries.
2020-07-26 Mark Andhadhun as watchedWilliam Carroll1-1/+1
What a confusing movie this was... I may need to watch it a second time to better understand what happened, but I found watching it once already so exhausting that I'm not sure I'll ever watch it again.
2020-07-26 Update schema for Movies tableWilliam Carroll2-90/+0
Added the following fields (would be cool if `git` could show this): - rating - haveWatched - director - isCartoon - requiresSubtitles
2020-07-26 Create //playbooks/sqlite3.mdWilliam Carroll1-0/+115
Write a playbook for using SQLite to capture some trivia that I often forget in between my ~infrequent uses of SQLite.
2020-07-26 Create //playbooks/shell.mdWilliam Carroll1-0/+12
Taken from the overview: > I'm making this as an offline reference for some of the commands that I use > often enough to need to remember but not often enough to *actually* remember.