Skip to content

Instantly share code, notes, and snippets.

@chrisdone-artificial
Created June 21, 2024 15:03
Show Gist options
  • Save chrisdone-artificial/4a4c0f55e87941c727f8e8dae99b765d to your computer and use it in GitHub Desktop.
Save chrisdone-artificial/4a4c0f55e87941c727f8e8dae99b765d to your computer and use it in GitHub Desktop.
Wire-up / registry
{-# language TemplateHaskell #-}
import Brossa.Prelude
import TH
import Things
main :: IO ()
main = $(wire 'app)
{-# language TemplateHaskell #-}
module TH where
import Prelude
import Language.Haskell.TH
wire :: Name -> Q Exp
wire n = do
i <- reify n
varE n
module Things where
import Brossa.Prelude
import Data.Aeson (Value)
data ValueStore m = ValueStore {
store :: Text -> Value -> m (),
retrieve :: Text -> m (Maybe Value)
}
data Logger m = Logger {
log :: Text -> m ()
}
data Sql m = Sql {
query :: Text -> m [Value]
}
valueStore :: Monad m => Sql m -> Logger m -> ValueStore m
valueStore sql logger = ValueStore {
store = \_text _value -> do logger.log "storing..."
void (sql.query "foo"),
retrieve = \key -> fmap listToMaybe (sql.query key)
}
app :: ValueStore m -> IO ()
app _ = pure ()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment