mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
57 lines
1 KiB
Go
57 lines
1 KiB
Go
|
package watcher
|
||
|
|
||
|
import (
|
||
|
"github.com/howeyc/fsnotify"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type Batcher struct {
|
||
|
*fsnotify.Watcher
|
||
|
interval time.Duration
|
||
|
done chan struct{}
|
||
|
|
||
|
Event chan []*fsnotify.FileEvent // Events are returned on this channel
|
||
|
}
|
||
|
|
||
|
func New(interval time.Duration) (*Batcher, error) {
|
||
|
watcher, err := fsnotify.NewWatcher()
|
||
|
|
||
|
batcher := &Batcher{}
|
||
|
batcher.Watcher = watcher
|
||
|
batcher.interval = interval
|
||
|
batcher.done = make(chan struct{}, 1)
|
||
|
batcher.Event = make(chan []*fsnotify.FileEvent, 1)
|
||
|
|
||
|
if err == nil {
|
||
|
go batcher.run()
|
||
|
}
|
||
|
|
||
|
return batcher, err
|
||
|
}
|
||
|
|
||
|
func (b *Batcher) run() {
|
||
|
tick := time.Tick(b.interval)
|
||
|
evs := make([]*fsnotify.FileEvent, 0)
|
||
|
OuterLoop:
|
||
|
for {
|
||
|
select {
|
||
|
case ev := <-b.Watcher.Event:
|
||
|
evs = append(evs, ev)
|
||
|
case <-tick:
|
||
|
if len(evs) == 0 {
|
||
|
continue
|
||
|
}
|
||
|
b.Event <- evs
|
||
|
evs = make([]*fsnotify.FileEvent, 0)
|
||
|
case <-b.done:
|
||
|
break OuterLoop
|
||
|
}
|
||
|
}
|
||
|
close(b.done)
|
||
|
}
|
||
|
|
||
|
func (b *Batcher) Close() {
|
||
|
b.done <- struct{}{}
|
||
|
b.Watcher.Close()
|
||
|
}
|