Move the seeded randomness and the {seq()} counters into internal/drawstate

This commit is contained in:
2026-10-05 11:43:45 +02:00
committed by Lillem4n
parent 4a680f03b3
commit 2d9c315e75
14 changed files with 107 additions and 76 deletions
+11 -9
View File
@@ -7,6 +7,8 @@ import (
"math"
"strconv"
"strings"
"github.com/larvit/fejkdata/internal/drawstate"
)
// maxLen caps sample output lengths (hex, nanoid, base64, digits, upper, lower)
@@ -40,19 +42,19 @@ var builtins = withTransforms(map[string]builtin{
"lower": {arity: 1, checkArgs: posIntArg, prep: chars("abcdefghijklmnopqrstuvwxyz")},
"base64": {arity: 1, checkArgs: posIntArg, prep: func(a []string) callFn {
n := atoi(a[0])
return func(s *generatorState, _ string, _ []string) string {
return func(s *drawstate.State, _ string, _ []string) string {
return base64.StdEncoding.EncodeToString(randBytes(s, n))
}
}},
"int": {arity: 2, checkArgs: intRangeArgs, prep: func(a []string) callFn {
lo, span := atoi(a[0]), atoi(a[1])-atoi(a[0])+1
return func(s *generatorState, _ string, _ []string) string { return strconv.Itoa(lo + s.IntN(span)) }
return func(s *drawstate.State, _ string, _ []string) string { return strconv.Itoa(lo + s.IntN(span)) }
}, prints: DataTypeInteger, proveNumber: func(token string, prints DataType, a []string) proven {
return printing(token, prints, bounded(float64(atoi(a[0])), float64(atoi(a[1])), true))
}},
"float": {arity: 3, checkArgs: floatArgs, prep: func(a []string) callFn {
lo, hi, dp := atof(a[0]), atof(a[1]), atoi(a[2])
return func(s *generatorState, _ string, _ []string) string {
return func(s *drawstate.State, _ string, _ []string) string {
return formatFloat(lo+s.Float64()*(hi-lo), dp)
}
}, prints: DataTypeNumber, proveNumber: func(token string, _ DataType, a []string) proven {
@@ -60,7 +62,7 @@ var builtins = withTransforms(map[string]builtin{
}},
"iban": {arity: 1, checkArgs: ibanArg, prep: func(a []string) callFn {
cc := a[0]
return func(s *generatorState, _ string, _ []string) string { return iban(s, cc) }
return func(s *drawstate.State, _ string, _ []string) string { return iban(s, cc) }
}},
"date": {arity: -1, checkArgs: dateArgs, prep: datePrep},
"time": {arity: -1, checkArgs: timeArg, prep: timePrep},
@@ -73,8 +75,8 @@ var builtins = withTransforms(map[string]builtin{
if len(a) == 1 {
key = a[0]
}
return func(s *generatorState, _ string, _ []string) string {
return strconv.FormatUint(s.next(key), 10)
return func(s *drawstate.State, _ string, _ []string) string {
return strconv.FormatUint(s.Next(key), 10)
}
}, prints: DataTypeInteger, proveNumber: func(token string, prints DataType, _ []string) proven {
return printing(token, prints, bounded(1, math.MaxInt64, true))
@@ -86,18 +88,18 @@ var builtins = withTransforms(map[string]builtin{
// sample of n characters drawn from an alphabet.
func derive(f func(emitted string) string) func([]string) callFn {
return func([]string) callFn {
return func(_ *generatorState, emitted string, _ []string) string { return f(emitted) }
return func(_ *drawstate.State, emitted string, _ []string) string { return f(emitted) }
}
}
func sample(f func(rng) string) func([]string) callFn {
return func([]string) callFn {
return func(s *generatorState, _ string, _ []string) string { return f(s) }
return func(s *drawstate.State, _ string, _ []string) string { return f(s) }
}
}
func chars(alphabet string) func([]string) callFn {
return func(a []string) callFn {
n := atoi(a[0])
return func(s *generatorState, _ string, _ []string) string { return randChars(s, n, alphabet) }
return func(s *drawstate.State, _ string, _ []string) string { return randChars(s, n, alphabet) }
}
}