Skip to main content

ratelimit/ulule - Plugin operators

This page lists all operators available in the ratelimit/ulule sub-package of ro.

Help improve this documentation

This documentation is still new and evolving. If you spot any mistakes, unclear explanations, or missing details, please open an issue.

Your feedback helps us improve!

Installโ€‹

First, import the sub-package in your project:

go get -u github.com/samber/ro/plugins/ratelimit/ulule
  • NewRateLimiterโ€‹

    Rate limits observable values using ulule/limiter with custom key extraction.

    import (
    "time"

    "github.com/samber/ro"
    roratelimit "github.com/samber/ro/plugins/ratelimit/ulule"
    "github.com/ulule/limiter"
    )

    rateLimiter, _ := limiter.New(limiter.Rate{
    Period: time.Hour,
    Limit: 100,
    })

    type Request struct {
    UserID string
    Action string
    Timestamp time.Time
    }

    obs := ro.Pipe[Request, Request](
    ro.Just(
    Request{UserID: "user1", Action: "login"},
    Request{UserID: "user2", Action: "login"},
    Request{UserID: "user1", Action: "post"},
    ),
    roratelimit.NewRateLimiter(rateLimiter, func(r Request) string {
    return r.UserID // Rate limit per user
    }),
    )

    sub := obs.Subscribe(ro.PrintObserver[Request]())
    defer sub.Unsubscribe()

    // Next: {UserID: user1, Action: login}
    // Next: {UserID: user2, Action: login}
    // Next: {UserID: user1, Action: post}
    // Completed
    Prototype:
    func NewRateLimiter[T any](limiter *limiter.Limiter, keyGetter func(T) string)