| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package flect
- import (
- "strings"
- "sync"
- )
- var singularMoot = &sync.RWMutex{}
- // Singularize returns a singular version of the string
- // users = user
- // data = datum
- // people = person
- func Singularize(s string) string {
- return New(s).Singularize().String()
- }
- // SingularizeWithSize will singular a string taking a number number into account.
- // SingularizeWithSize("user", 1) = user
- // SingularizeWithSize("user", 2) = users
- func SingularizeWithSize(s string, i int) string {
- if i == 1 || i == -1 {
- return New(s).Singularize().String()
- }
- return New(s).Pluralize().String()
- }
- // Singularize returns a singular version of the string
- // users = user
- // data = datum
- // people = person
- func (i Ident) Singularize() Ident {
- s := i.Original
- if len(s) == 0 {
- return i
- }
- singularMoot.RLock()
- defer singularMoot.RUnlock()
- ls := strings.ToLower(s)
- if p, ok := pluralToSingle[ls]; ok {
- return New(p)
- }
- if _, ok := singleToPlural[ls]; ok {
- return i
- }
- for _, r := range singularRules {
- if strings.HasSuffix(ls, r.suffix) {
- return New(r.fn(s))
- }
- }
- if strings.HasSuffix(s, "s") {
- return New(s[:len(s)-1])
- }
- return i
- }
|