Skip to content

Instantly share code, notes, and snippets.

@arshamalh
Last active July 26, 2025 05:23
Show Gist options
  • Save arshamalh/f89004c496c69872015801a761da98f6 to your computer and use it in GitHub Desktop.
Save arshamalh/f89004c496c69872015801a761da98f6 to your computer and use it in GitHub Desktop.
Session Based Ticker
package main
import (
"fmt"
"time"
)
type SessionBasedTicker struct {
start time.Time
end time.Time
tick <-chan time.Time
}
func NewSessionBasedTicker(start, end time.Time, duration time.Duration) *SessionBasedTicker {
return &SessionBasedTicker{
start: start,
end: end,
tick: time.Tick(duration),
}
}
func (sbt *SessionBasedTicker) Tick() <-chan time.Time {
sessionTick := make(chan time.Time)
go func() {
for tickTime := range sbt.tick {
if tickTime.After(sbt.start) && tickTime.Before(sbt.end) {
sessionTick <- tickTime
}
}
}()
return sessionTick
}
func main() {
// Ticks from now till the next hour, every second.
sbt := NewSessionBasedTicker(time.Now().Add(time.Second*10), time.Now().Add(time.Hour), time.Second)
for range sbt.Tick() {
fmt.Println("hi")
}
}
package main
import (
"time"
)
func NewSessionBasedTicker(start, end time.Time, duration time.Duration) <-chan time.Time {
sessionTick := make(chan time.Time)
go func() {
for tickTime := range time.Tick(duration) {
if tickTime.After(start) && tickTime.Before(end) {
sessionTick <- tickTime
}
}
}()
return sessionTick
}
func main() {
// Ticks from now till the next hour, every second.
sbt := NewSessionBasedTicker(time.Now().Add(time.Second*10), time.Now().Add(time.Hour), time.Second)
for range sbt {
fmt.Println("hi")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment