Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
4181cd5fed
|
|||
|
b1cc2af8d8
|
|||
| 7725019ed7 | |||
| fcae935511 | |||
|
|
14eb48d336 | ||
|
|
15399ff5e1 | ||
|
6ef0c668a2
|
|||
|
8be5d358f1
|
30
.gitea/workflows/github-mirror.yml
Normal file
30
.gitea/workflows/github-mirror.yml
Normal file
@@ -0,0 +1,30 @@
|
||||
name: Go Bump
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
|
||||
jobs:
|
||||
bump:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
fetch-tags: true
|
||||
|
||||
- name: Deploy to external repository
|
||||
uses: https://git.sour.is/actions/github-action-push-to-another-repository@main
|
||||
env:
|
||||
API_TOKEN_GITHUB: ${{ secrets.GH_TOKEN }}
|
||||
with:
|
||||
# GitHub Action output files
|
||||
source-directory: .
|
||||
destination-github-username: sour-is
|
||||
destination-repository-name: go-pkg
|
||||
user-email: jon@xuu.cc
|
||||
# It defaults to `main`
|
||||
target-branch: "main"
|
||||
|
||||
- run: echo "🍏 This job's status is ${{ job.status }}."
|
||||
|
||||
10
go.mod
10
go.mod
@@ -1,6 +1,6 @@
|
||||
module go.sour.is/pkg
|
||||
|
||||
go 1.20
|
||||
go 1.21
|
||||
|
||||
require (
|
||||
github.com/99designs/gqlgen v0.17.34
|
||||
@@ -39,7 +39,7 @@ require (
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
|
||||
github.com/prometheus/client_golang v1.17.0
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0
|
||||
go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/prometheus v0.41.0
|
||||
@@ -47,9 +47,9 @@ require (
|
||||
go.opentelemetry.io/otel/sdk v1.18.0
|
||||
go.opentelemetry.io/otel/trace v1.18.0
|
||||
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
|
||||
golang.org/x/net v0.12.0 // indirect
|
||||
golang.org/x/sys v0.12.0 // indirect
|
||||
golang.org/x/text v0.11.0 // indirect
|
||||
golang.org/x/net v0.17.0 // indirect
|
||||
golang.org/x/sys v0.13.0 // indirect
|
||||
golang.org/x/text v0.13.0 // indirect
|
||||
google.golang.org/grpc v1.58.0 // indirect
|
||||
google.golang.org/protobuf v1.31.0 // indirect
|
||||
)
|
||||
|
||||
16
go.sum
16
go.sum
@@ -69,8 +69,8 @@ github.com/vektah/gqlparser/v2 v2.5.6 h1:Ou14T0N1s191eRMZ1gARVqohcbe1e8FrcONScsq
|
||||
github.com/vektah/gqlparser/v2 v2.5.6/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME=
|
||||
go.opentelemetry.io/contrib v1.16.1 h1:EpASvVyGx6/ZTlmXzxYfTMZxHROelCeXXa2uLiwltcs=
|
||||
go.opentelemetry.io/contrib v1.16.1/go.mod h1:gIzjwWFoGazJmtCaDgViqOSJPde2mCWzv60o0bWPcZs=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48=
|
||||
go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 h1:EbmAUG9hEAMXyfWEasIt2kmh/WmXUznUksChApTgBGc=
|
||||
go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0/go.mod h1:rD9feqRYP24P14t5kmhNMqsqm1jvKmpx2H2rKVw52V8=
|
||||
go.opentelemetry.io/otel v1.18.0 h1:TgVozPGZ01nHyDZxK5WGPFB9QexeTMXEH7+tIClWfzs=
|
||||
@@ -93,15 +93,15 @@ go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lI
|
||||
go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
|
||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
|
||||
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
|
||||
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
|
||||
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw=
|
||||
|
||||
189
grug/math/math.go
Normal file
189
grug/math/math.go
Normal file
@@ -0,0 +1,189 @@
|
||||
// grug math is an unbounded precision math library for integers. It is not designed to be performant in any means. But as an example of how one works.
|
||||
package math
|
||||
|
||||
import "strconv"
|
||||
|
||||
type Number []rune
|
||||
|
||||
func NewNumber() *Number {
|
||||
return &Number{}
|
||||
}
|
||||
|
||||
func (*Number) FromString(s string) *Number {
|
||||
for _, a := range s {
|
||||
if !(a >= '0' && a <= '9') {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
var n Number = []rune(s)
|
||||
|
||||
i:=0
|
||||
for range n[:len(n)-1] {
|
||||
if n[i] == 0 || n[i] == '0' {
|
||||
i++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
n = n[i:]
|
||||
|
||||
return &n
|
||||
}
|
||||
|
||||
func (*Number) FromInt(i int) *Number {
|
||||
s := strconv.Itoa(i)
|
||||
var n Number = []rune(s)
|
||||
return &n
|
||||
}
|
||||
|
||||
func (n *Number) String() string {
|
||||
if n == nil || len(*n) == 0 {
|
||||
return "NaN"
|
||||
}
|
||||
return string(*n)
|
||||
}
|
||||
|
||||
func (n *Number) Add(a *Number) *Number {
|
||||
if n == nil || a == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
lenN, lenA := len(*n), len(*a)
|
||||
sum := make(Number, max(lenN, lenA)+1)
|
||||
|
||||
for i := range sum[:len(sum)-1] {
|
||||
ii := len(sum) - i - 1
|
||||
|
||||
switch {
|
||||
case lenN == lenA:
|
||||
j := (*n)[lenN-i-1]
|
||||
k := (*a)[lenA-i-1]
|
||||
|
||||
sum[ii-1], sum[ii] = add(j, k, sum[ii])
|
||||
|
||||
case lenN > lenA:
|
||||
j := (*n)[lenN-i-1]
|
||||
k := '0'
|
||||
if i < lenA {
|
||||
k = (*a)[lenA-i-1]
|
||||
}
|
||||
|
||||
sum[ii-1], sum[ii] = add(j, k, sum[ii])
|
||||
|
||||
case lenN < lenA:
|
||||
j := '0'
|
||||
if i < lenN {
|
||||
j = (*n)[lenN-i-1]
|
||||
}
|
||||
k := (*a)[lenA-i-1]
|
||||
|
||||
sum[ii-1], sum[ii] = add(j, k, sum[ii])
|
||||
}
|
||||
}
|
||||
|
||||
// Trim the extra 0 if present
|
||||
if sum[0] == 0 || sum[0] == '0' {
|
||||
sum = sum[1:]
|
||||
}
|
||||
|
||||
return &sum
|
||||
}
|
||||
|
||||
|
||||
func (n *Number) Sub(s *Number) *Number {
|
||||
if n == nil || s == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
lenN, lenA := len(*n), len(*s)
|
||||
sum := make(Number, max(lenN, lenA)+1)
|
||||
|
||||
for i := range sum[:len(sum)-1] {
|
||||
ii := len(sum) - i - 1
|
||||
|
||||
switch {
|
||||
case lenN == lenA:
|
||||
j := (*n)[lenN-i-1]
|
||||
k := (*s)[lenA-i-1]
|
||||
c := '0'
|
||||
if i+1 < lenN {
|
||||
c = (*n)[lenN-i-2]
|
||||
}
|
||||
|
||||
sum[ii-1], sum[ii] = sub(j, k, c)
|
||||
|
||||
case lenN > lenA:
|
||||
j := (*n)[lenN-i-1]
|
||||
k := '0'
|
||||
if i < lenA {
|
||||
k = (*s)[lenA-i-1]
|
||||
}
|
||||
c := '0'
|
||||
if i+1 < lenN {
|
||||
c = (*n)[lenN-i-2]
|
||||
}
|
||||
|
||||
sum[ii-1], sum[ii] = sub(j, k, c)
|
||||
if i+1 < lenN {
|
||||
(*n)[lenN-i-2] =sum[ii-1]
|
||||
}
|
||||
|
||||
case lenN < lenA:
|
||||
j := '0'
|
||||
if i < lenN {
|
||||
j = (*n)[lenN-i-1]
|
||||
}
|
||||
k := (*s)[lenA-i-1]
|
||||
c := '0'
|
||||
if i+1 < lenN {
|
||||
c = (*n)[lenN-i-2]
|
||||
}
|
||||
|
||||
sum[ii-1], sum[ii] = sub(j, k, c)
|
||||
}
|
||||
}
|
||||
|
||||
// Trim the extra 0 if present
|
||||
i:=0
|
||||
for range sum[:len(sum)-1] {
|
||||
if sum[i] == 0 || sum[i] == '0' {
|
||||
i++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
sum = sum[i:]
|
||||
|
||||
|
||||
return &sum
|
||||
}
|
||||
|
||||
|
||||
func friends(r rune) (int32, int32) {
|
||||
return 1, 10 - int32(r-'0')
|
||||
}
|
||||
func add(a, b, c rune) (rune, rune) {
|
||||
up, dn := friends(b)
|
||||
if c == 0 {
|
||||
c = '0'
|
||||
}
|
||||
a = a + c - '0'
|
||||
|
||||
if a-dn < '0' {
|
||||
return '0', a + b - '0'
|
||||
}
|
||||
return c + up, a - dn
|
||||
}
|
||||
|
||||
func sub(a, b, c rune) (rune, rune) {
|
||||
dn, up := friends(b)
|
||||
if c == 0 {
|
||||
c = '0'
|
||||
}
|
||||
|
||||
if a+up > '9' {
|
||||
return c, a - b + '0'
|
||||
}
|
||||
return c - dn, a + up
|
||||
}
|
||||
74
grug/math/math_test.go
Normal file
74
grug/math/math_test.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package math_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/matryer/is"
|
||||
"go.sour.is/pkg/grug/math"
|
||||
)
|
||||
|
||||
func TestNumber(t *testing.T) {
|
||||
is := is.New(t)
|
||||
|
||||
n := math.NewNumber().FromInt(100)
|
||||
is.Equal(n.String(), "100")
|
||||
|
||||
n = n.FromString("00001")
|
||||
is.Equal(n.String(), "1")
|
||||
|
||||
n = n.FromString("1x0")
|
||||
is.True(n==nil)
|
||||
is.Equal(n.String(), "NaN")
|
||||
|
||||
n = n.FromString("200")
|
||||
is.True(n!=nil)
|
||||
is.Equal(n.String(), "200")
|
||||
|
||||
n = (&math.Number{}).FromString("300")
|
||||
is.True(n!=nil)
|
||||
is.Equal(n.String(), "300")
|
||||
}
|
||||
|
||||
func TestAdd(t *testing.T) {
|
||||
is := is.New(t)
|
||||
|
||||
n := math.NewNumber().FromString("100")
|
||||
|
||||
n = n.Add(nil)
|
||||
is.Equal(n.String(), "NaN")
|
||||
|
||||
n = n.FromInt(100)
|
||||
n = n.Add(n.FromString("900"))
|
||||
is.Equal(n.String(), "1000")
|
||||
|
||||
n = n.Add(math.NewNumber())
|
||||
is.Equal(n.String(), "1000")
|
||||
|
||||
n = n.Add(n.FromString("10"))
|
||||
is.Equal(n.String(), "1010")
|
||||
|
||||
n = n.Add(n.FromString("10000"))
|
||||
is.Equal(n.String(), "11010")
|
||||
|
||||
n = n.Add(n.FromString("9000"))
|
||||
is.Equal(n.String(), "20010")
|
||||
}
|
||||
|
||||
func TestSub(t *testing.T) {
|
||||
is := is.New(t)
|
||||
|
||||
n := math.NewNumber()
|
||||
|
||||
// n = n.FromString("100")
|
||||
// n = n.Sub(n.FromInt(100))
|
||||
// is.Equal(n.String(), "0")
|
||||
|
||||
// n = n.FromString("200")
|
||||
// n = n.Sub(n.FromInt(100))
|
||||
// is.Equal(n.String(), "100")
|
||||
|
||||
n = n.FromString("100")
|
||||
n = n.Sub(n.FromInt(50))
|
||||
is.Equal(n.String(), "50")
|
||||
|
||||
}
|
||||
@@ -71,7 +71,7 @@ func (w wrapSpan) AddEvent(name string, options ...trace.EventOption) {
|
||||
args[2*i+1] = a.Value
|
||||
}
|
||||
|
||||
slog.Info(name, args...)
|
||||
slog.Debug(name, args...)
|
||||
}
|
||||
|
||||
func (w wrapSpan) RecordError(err error, options ...trace.EventOption) {
|
||||
@@ -142,7 +142,7 @@ func initTracing(ctx context.Context, name string) (context.Context, func() erro
|
||||
return ctx, nil
|
||||
}
|
||||
|
||||
exporterAddr := env.Default("EV_TRACE_ENDPOINT", "")
|
||||
exporterAddr := env.Default("TRACE_ENDPOINT", "")
|
||||
if exporterAddr == "" {
|
||||
return ctx, nil
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ func (s *Harness) Run(ctx context.Context, appName, version string) error {
|
||||
span.End()
|
||||
}
|
||||
|
||||
g, _ := errgroup.WithContext(ctx)
|
||||
g, ctx := errgroup.WithContext(ctx)
|
||||
g.Go(func() error {
|
||||
<-ctx.Done()
|
||||
// shutdown jobs
|
||||
@@ -111,7 +111,10 @@ func (s *Harness) Run(ctx context.Context, appName, version string) error {
|
||||
close(s.onRunning)
|
||||
|
||||
err := g.Wait()
|
||||
if err != nil {
|
||||
log.Printf("Shutdown due to error: %s", err)
|
||||
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user