summaryrefslogtreecommitdiff
path: root/fig-utils/src/Fig/Utils
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-03-07 23:41:50 -0500
committerLLLL Colonq <llll@colonq>2026-03-07 23:41:50 -0500
commitcb85036ca25cd9e13e4e959e105b88bb73dbf9e5 (patch)
tree93bbf019944db71482fd2f6bcd5ffe94442f9bdb /fig-utils/src/Fig/Utils
parent8cbf224b0edc8646690ebbc877d6f72507447d7a (diff)
Refactor, use app tokens
Diffstat (limited to 'fig-utils/src/Fig/Utils')
-rw-r--r--fig-utils/src/Fig/Utils/DB.hs112
1 files changed, 112 insertions, 0 deletions
diff --git a/fig-utils/src/Fig/Utils/DB.hs b/fig-utils/src/Fig/Utils/DB.hs
new file mode 100644
index 0000000..88a2f37
--- /dev/null
+++ b/fig-utils/src/Fig/Utils/DB.hs
@@ -0,0 +1,112 @@
+module Fig.Utils.DB where
+
+import Data.Maybe (mapMaybe)
+import Data.Map.Strict (Map)
+import qualified Data.Map.Strict as Map
+
+import qualified Database.Redis as Redis
+
+import Fig.Prelude
+
+newtype DB = DB { conn :: Redis.Connection }
+
+connect :: MonadIO m => Text -> m DB
+connect host = liftIO $ DB <$> Redis.checkedConnect Redis.defaultConnectInfo
+ { Redis.connectHost = unpack host
+ }
+
+run :: MonadIO m => DB -> Redis.Redis a -> m a
+run (DB c) f = liftIO $ Redis.runRedis c f
+
+get :: ByteString -> Redis.Redis (Maybe ByteString)
+get key = do
+ v <- Redis.get key
+ pure . join $ hush v
+
+del :: [ByteString] -> Redis.Redis ()
+del keys = do
+ void $ Redis.del keys
+
+incr :: ByteString -> Redis.Redis ()
+incr key = do
+ void $ Redis.incr key
+
+decr :: ByteString -> Redis.Redis ()
+decr key = do
+ void $ Redis.decr key
+
+hset :: ByteString -> ByteString -> ByteString -> Redis.Redis ()
+hset key hkey val = do
+ void $ Redis.hset key hkey val
+
+hget :: ByteString -> ByteString -> Redis.Redis (Maybe ByteString)
+hget key hkey = do
+ v <- Redis.hget key hkey
+ pure . join $ hush v
+
+hdel :: ByteString -> ByteString -> Redis.Redis ()
+hdel key hkey = do
+ void $ Redis.hdel key [hkey]
+
+hmset :: ByteString -> [(ByteString, ByteString)] -> Redis.Redis ()
+hmset key m = do
+ void $ Redis.hmset key m
+
+hmget :: ByteString -> [ByteString] -> Redis.Redis (Map ByteString ByteString)
+hmget key hk = do
+ Redis.hmget key hk >>= \case
+ Left _ -> pure Map.empty
+ Right vals -> do
+ pure . Map.fromList . mapMaybe (\(a, mb) -> mb >>= \b -> Just (a, b)) $ zip hk vals
+
+hgetall :: ByteString -> Redis.Redis (Map ByteString ByteString)
+hgetall key = do
+ Redis.hgetall key >>= \case
+ Left _ -> pure Map.empty
+ Right m -> pure $ Map.fromList m
+
+hkeys :: ByteString -> Redis.Redis (Maybe [ByteString])
+hkeys key = do
+ hush <$> Redis.hkeys key
+
+hvals :: ByteString -> Redis.Redis (Maybe [ByteString])
+hvals key = do
+ hush <$> Redis.hvals key
+
+sadd :: ByteString -> [ByteString] -> Redis.Redis ()
+sadd key skeys = do
+ void $ Redis.sadd key skeys
+
+srem :: ByteString -> [ByteString] -> Redis.Redis ()
+srem key skeys = do
+ void $ Redis.srem key skeys
+
+smembers :: ByteString -> Redis.Redis (Maybe [ByteString])
+smembers key = do
+ hush <$> Redis.smembers key
+
+sismember :: ByteString -> ByteString -> Redis.Redis Bool
+sismember key skey = do
+ Redis.sismember key skey >>= hush >>> \case
+ Just x -> pure x
+ Nothing -> pure False
+
+lpop :: ByteString -> Redis.Redis (Maybe ByteString)
+lpop key = do
+ join . hush <$> Redis.lpop key
+
+rpush :: ByteString -> ByteString -> Redis.Redis ()
+rpush key val = do
+ void $ Redis.rpush key [val]
+
+lrange :: ByteString -> Integer -> Integer -> Redis.Redis [ByteString]
+lrange key start end = do
+ fromMaybe [] . hush <$> Redis.lrange key start end
+
+llen :: ByteString -> Redis.Redis (Maybe Integer)
+llen key = do
+ hush <$> Redis.llen key
+
+lindex :: ByteString -> Integer -> Redis.Redis (Maybe ByteString)
+lindex key idx = do
+ join . hush <$> Redis.lindex key idx