Skip to main content

Geo API

Purely functional interface for the Geo API.

Usage

import cats.effect.*
import dev.profunktor.valkey4cats.Valkey
import dev.profunktor.valkey4cats.effect.Log
import dev.profunktor.valkey4cats.model.ValkeyResponse.{Ok, Err}
import dev.profunktor.valkey4cats.arguments.{GeoPosition, GeoUnit, GeoSearchFrom, GeoSearchBy}

given Log[IO] = Log.Stdout.instance[IO]

Valkey[IO].utf8("valkey://localhost:6379").use { valkey =>
for
// GEOADD - add locations
added <- valkey.geoAdd("locations", Map(
"Buenos Aires" -> GeoPosition(-58.3816, -34.6037),
"Rio de Janeiro" -> GeoPosition(-43.1729, -22.9068),
"Tokyo" -> GeoPosition(139.6917, 35.6895)
))
_ <- IO.println(s"Added: ${added.toOption}")

// GEODIST - distance between two members
dist <- valkey.geoDist("locations", "Buenos Aires", "Tokyo", GeoUnit.Kilometers)
_ <- IO.println(s"Buenos Aires to Tokyo: ${dist.toOption} km")

// GEOSEARCH - find members within radius
nearby <- valkey.geoSearch(
"locations",
GeoSearchFrom.FromMember("Buenos Aires"),
GeoSearchBy.ByRadius(2000.0, GeoUnit.Kilometers)
)
_ <- IO.println(s"Within 2000km: ${nearby.toOption}")

// GEOSEARCH - find members within box
inBox <- valkey.geoSearch(
"locations",
GeoSearchFrom.FromCoord(GeoPosition(-55.0, -33.0)),
GeoSearchBy.ByBox(3000.0, 2000.0, GeoUnit.Kilometers)
)
_ <- IO.println(s"In box: ${inBox.toOption}")
yield ()
}

Available commands

CommandMethodReturn type
GEOADDgeoAdd(key, members)F[ValkeyResponse[Long]]
GEODISTgeoDist(key, member1, member2)F[ValkeyResponse[Option[Double]]]
GEODIST (unit)geoDist(key, m1, m2, unit)F[ValkeyResponse[Option[Double]]]
GEOHASHgeoHash(key, members*)F[ValkeyResponse[List[Option[String]]]]
GEOPOSgeoPos(key, members*)F[ValkeyResponse[List[Option[GeoPosition]]]]
GEOSEARCHgeoSearch(key, from, by)F[ValkeyResponse[List[V]]]
GEOSEARCHSTOREgeoSearchStore(dest, src, from, by)F[ValkeyResponse[Long]]