File: string.go

package info (click to toggle)
golang-text 0.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 128 kB
  • sloc: makefile: 5
file content (74 lines) | stat: -rw-r--r-- 1,565 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main

import (
	"math/rand"
	"strings"
)

func first(s, arg string) agg  { return &sbinop{s, opfirst} }
func last(s, arg string) agg   { return &sbinop{s, oplast} }
func prefix(s, arg string) agg { return &sbinop{s, opprefix} }
func join(s, arg string) agg   { return &sbinop{s, opjoin(arg)} }
func smin(s, arg string) agg   { return &sbinop{s, opsmin} }
func smax(s, arg string) agg   { return &sbinop{s, opsmax} }

type sbinop struct {
	s string
	f func(a, b string) string
}

func (o *sbinop) String() string { return o.s }

func (o *sbinop) merge(s string) { o.s = o.f(o.s, s) }

func opfirst(a, b string) string { return a }
func oplast(a, b string) string  { return b }

func opprefix(a, b string) string {
	for i := range a {
		if i >= len(b) || a[i] != b[i] {
			return a[:i]
		}
	}
	return a
}

func opjoin(sep string) func(a, b string) string {
	return func(a, b string) string {
		return a + sep + b // TODO(kr): too slow? maybe strings.Join?
	}
}

func opsmin(a, b string) string {
	if strings.Compare(a, b) <= 0 {
		return a
	}
	return b
}

func opsmax(a, b string) string {
	if strings.Compare(a, b) >= 0 {
		return a
	}
	return b
}

type sampler struct {
	n int
	s string
}

func sample(s, arg string) agg    { return &sampler{1, s} }
func (p *sampler) String() string { return p.s }
func (p *sampler) merge(s string) {
	p.n++
	if rand.Intn(p.n) == 0 {
		p.s = s
	}
}

type constant string

func constf(init, arg string) agg { return constant(arg) }
func (c constant) String() string { return string(c) }
func (c constant) merge(string)   {}