Skip to content

Instantly share code, notes, and snippets.

@Woody88
Created April 2, 2020 08:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Woody88/0f32d916b335da9f489687513f383838 to your computer and use it in GitHub Desktop.
Save Woody88/0f32d916b335da9f489687513f383838 to your computer and use it in GitHub Desktop.
purescript-redis-client's scanStream implementation
"use strict";
const Redis = require('ioredis')
exports.scanStreamImpl = conn => options => (onError, onSuccess) => {
const redis = new Redis(conn.options)
var stream = redis.scanStream(options)
stream.on("data", resultKeys => {
// `resultKeys` is an array of strings representing key names.
// Note that resultKeys may contain 0 keys, and that it will sometimes
// contain duplicates due to SCAN's implementation in Redis.
// woody: Should I check for duplicates here or leave it to end user??
onSuccess(resultKeys)
});
stream.on("error", err => {
onError(err)
})
stream.on("end", () => {
redis.disconnect()
})
return function (cancelError, cancelerError, cancelerSuccess) {
redis.disconnect()
cancelerSuccess()
}
}
module Infra.Resources.Database.Redis.Scan (ScanStreamOptions, scanStream) where
import Prelude
import Data.ByteString (ByteString)
import Database.Redis as Redis
import Effect.Aff (Aff)
import Effect.Aff.Compat (EffectFnAff, fromEffectFnAff)
import Prim.Row (class Union)
foreign import scanStreamImpl :: forall opts. Redis.Connection -> Record opts -> EffectFnAff (Array ByteString)
type ScanStreamOptions
= ( count :: Int
, match :: String
)
scanStream :: forall options t.
Union options t ScanStreamOptions
=> Redis.Connection
-> Record options
-> Aff (Array ByteString)
scanStream redis options = fromEffectFnAff $ scanStreamImpl redis options
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment