Skip to content

Instantly share code, notes, and snippets.

View nicolashery's full-sized avatar

Nicolas Hery nicolashery

View GitHub Profile

Using MonadLogger without LoggingT in Haskell

Using RIO with Servant in Haskell, with nested environments.

Port of servant-nested-apis Gist.

Nesting APIs and ReaderT environments in Haskell's Servant

Environments, from parent to child (or base to extended):

  • App (ReaderT AppEnv IO):
    • HasLogFunc env
    • HasDatabase env
    • HasTracing env
  • AppAuthenticated (ReaderT AppAuthenticatedEnv IO):
  • HasApp env (everything from App)

App-wide vs. Handler-specific environments in Haskell's Servant

See files:

Client requests:

nicolashery / AsyncMonadBaseControlExample.hs
Created September 9, 2022 14:01
Haskell ReaderT LoggingT - MonadBaseControl vs. MonadUnliftIO
module AsyncMonadBaseControlExample where
import Blammo.Logging (LoggingT)
import Control.Concurrent.Async.Lifted.Safe (concurrently)
import Control.Monad.Base (MonadBase)
import Control.Monad.Reader (MonadIO, MonadReader, MonadTrans (lift), ReaderT)
import Control.Monad.Trans.Control (MonadBaseControl (liftBaseWith, restoreM), StM)
import Data.Text.Lazy qualified as TL
import Web.Scotty.Trans (ActionT, text)
#!/usr/bin/env stack
{- stack
--resolver lts-13.4
--ghc-options "-Wall"
--package aeson
--package aeson-pretty
--package aeson-typescript
--package base
nicolashery /
Last active May 2, 2023 06:53
Emulating "enums" in JSDoc version of TypeScript

Emulating "enums" in JSDoc version of TypeScript


TypeScript has support for type-checking plain JavaScript files, which is very useful if you have an existing JS codebase and you want to test the waters and gradually add types.

There are some limitations in what you can do in JSDoc, but a lot of them can be worked-around by using type-definition files .d.ts (for example in a types/ directory). These files don't generate any JavaScript code, they are just there to provide extra type definitions to the compiler.

One thing you can't do in those .d.ts files though, is use enums. You could define them of course, but you won't get the runtime representation since the files don't generate JS code.

nicolashery / Makefile
Last active January 7, 2018 21:50
Svelte.js & Google Closure Compiler
mkdir -p vendor
curl -o vendor/closure-compiler.tar.gz $(CLOSURE_COMPILER_URL)
tar -C vendor/ -zxf vendor/closure-compiler.tar.gz
mv vendor/closure-compiler-v$(CLOSURE_COMPILER_VERSION).jar vendor/closure-compiler.jar
rm vendor/COPYING vendor/ vendor/closure-compiler.tar.gz
nicolashery / .gitignore
Last active September 17, 2023 16:58
TypeScript React JSDoc