forked from Mirrors/bubbletea
165 lines
2.4 KiB
Go
165 lines
2.4 KiB
Go
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"math/rand"
|
|||
|
"sync"
|
|||
|
)
|
|||
|
|
|||
|
type randomItemGenerator struct {
|
|||
|
titles []string
|
|||
|
descs []string
|
|||
|
titleIndex int
|
|||
|
descIndex int
|
|||
|
mtx *sync.Mutex
|
|||
|
shuffle *sync.Once
|
|||
|
}
|
|||
|
|
|||
|
func (r *randomItemGenerator) reset() {
|
|||
|
r.mtx = &sync.Mutex{}
|
|||
|
r.shuffle = &sync.Once{}
|
|||
|
|
|||
|
r.titles = []string{
|
|||
|
"Artichoke",
|
|||
|
"Baking Flour",
|
|||
|
"Bananas",
|
|||
|
"Barley",
|
|||
|
"Bean Sprouts",
|
|||
|
"Bitter Melon",
|
|||
|
"Black Cod",
|
|||
|
"Blood Orange",
|
|||
|
"Brown Sugar",
|
|||
|
"Cashew Apple",
|
|||
|
"Cashews",
|
|||
|
"Cat Food",
|
|||
|
"Coconut Milk",
|
|||
|
"Cucumber",
|
|||
|
"Curry Paste",
|
|||
|
"Currywurst",
|
|||
|
"Dill",
|
|||
|
"Dragonfruit",
|
|||
|
"Dried Shrimp",
|
|||
|
"Eggs",
|
|||
|
"Fish Cake",
|
|||
|
"Furikake",
|
|||
|
"Garlic",
|
|||
|
"Gherkin",
|
|||
|
"Ginger",
|
|||
|
"Granulated Sugar",
|
|||
|
"Grapefruit",
|
|||
|
"Green Onion",
|
|||
|
"Hazelnuts",
|
|||
|
"Heavy whipping cream",
|
|||
|
"Honey Dew",
|
|||
|
"Horseradish",
|
|||
|
"Jicama",
|
|||
|
"Kohlrabi",
|
|||
|
"Leeks",
|
|||
|
"Lentils",
|
|||
|
"Licorice Root",
|
|||
|
"Meyer Lemons",
|
|||
|
"Milk",
|
|||
|
"Molasses",
|
|||
|
"Muesli",
|
|||
|
"Nectarine",
|
|||
|
"Niagamo Root",
|
|||
|
"Nopal",
|
|||
|
"Nutella",
|
|||
|
"Oat Milk",
|
|||
|
"Oatmeal",
|
|||
|
"Olives",
|
|||
|
"Papaya",
|
|||
|
"Party Gherkin",
|
|||
|
"Peppers",
|
|||
|
"Persian Lemons",
|
|||
|
"Pickle",
|
|||
|
"Pineapple",
|
|||
|
"Plantains",
|
|||
|
"Pocky",
|
|||
|
"Powdered Sugar",
|
|||
|
"Quince",
|
|||
|
"Radish",
|
|||
|
"Ramps",
|
|||
|
"Star Anise",
|
|||
|
"Sweet Potato",
|
|||
|
"Tamarind",
|
|||
|
"Unsalted Butter",
|
|||
|
"Watermelon",
|
|||
|
"Weißwurst",
|
|||
|
"Yams",
|
|||
|
"Yeast",
|
|||
|
"Yuzu",
|
|||
|
"Snow Peas",
|
|||
|
}
|
|||
|
|
|||
|
r.descs = []string{
|
|||
|
"A little weird",
|
|||
|
"Bold flavor",
|
|||
|
"Can’t get enough",
|
|||
|
"Delectable",
|
|||
|
"Expensive",
|
|||
|
"Expired",
|
|||
|
"Exquisite",
|
|||
|
"Fresh",
|
|||
|
"Gimme",
|
|||
|
"In season",
|
|||
|
"Kind of spicy",
|
|||
|
"Looks fresh",
|
|||
|
"Looks good to me",
|
|||
|
"Maybe not",
|
|||
|
"My favorite",
|
|||
|
"Oh my",
|
|||
|
"On sale",
|
|||
|
"Organic",
|
|||
|
"Questionable",
|
|||
|
"Really fresh",
|
|||
|
"Refreshing",
|
|||
|
"Salty",
|
|||
|
"Scrumptious",
|
|||
|
"Delectable",
|
|||
|
"Slightly sweet",
|
|||
|
"Smells great",
|
|||
|
"Tasty",
|
|||
|
"Too ripe",
|
|||
|
"At last",
|
|||
|
"What?",
|
|||
|
"Wow",
|
|||
|
"Yum",
|
|||
|
"Maybe",
|
|||
|
"Sure, why not?",
|
|||
|
}
|
|||
|
|
|||
|
r.shuffle.Do(func() {
|
|||
|
shuf := func(x []string) {
|
|||
|
rand.Shuffle(len(x), func(i, j int) { x[i], x[j] = x[j], x[i] })
|
|||
|
}
|
|||
|
shuf(r.titles)
|
|||
|
shuf(r.descs)
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
func (r *randomItemGenerator) next() item {
|
|||
|
if r.mtx == nil {
|
|||
|
r.reset()
|
|||
|
}
|
|||
|
|
|||
|
r.mtx.Lock()
|
|||
|
defer r.mtx.Unlock()
|
|||
|
|
|||
|
i := item{
|
|||
|
title: r.titles[r.titleIndex],
|
|||
|
description: r.descs[r.descIndex],
|
|||
|
}
|
|||
|
|
|||
|
r.titleIndex++
|
|||
|
if r.titleIndex >= len(r.titles) {
|
|||
|
r.titleIndex = 0
|
|||
|
}
|
|||
|
|
|||
|
r.descIndex++
|
|||
|
if r.descIndex >= len(r.descs) {
|
|||
|
r.descIndex = 0
|
|||
|
}
|
|||
|
|
|||
|
return i
|
|||
|
}
|