mod_num.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // package mod_num -- номер модуля
  2. package mod_num
  3. import (
  4. "fmt"
  5. "sync"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  7. )
  8. // AModNum -- номер модуля.
  9. type AModNum lev0.Int
  10. // IModNumFix -- фиксированный модуль номера.
  11. type IModNumFix interface {
  12. lev0.IString[AModNum]
  13. }
  14. // moduleNum -- номер модуля.
  15. type moduleNum struct {
  16. num AModNum // Номер модуля
  17. }
  18. var (
  19. nextNum AModNum // Следующий номер модуля
  20. block sync.Mutex
  21. )
  22. // NewModuleNum -- возвращает новый модуль номера.
  23. func NewModuleNumFix() IModNumFix {
  24. block.Lock()
  25. defer block.Unlock()
  26. sf := &moduleNum{
  27. num: nextNum,
  28. }
  29. nextNum++
  30. return sf
  31. }
  32. // FromStr -- возвращает новый номер модуля из строки.
  33. func FromStr(txtNumMod *lev0.LTxt) *lev0.Result[IModNumFix] {
  34. resNum := txtNumMod.Atoi()
  35. if resNum.IsErr() {
  36. err := lev0.LetErr("FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", txtNumMod, resNum.Err())
  37. return lev0.ResErr[IModNumFix](err)
  38. }
  39. sf := &moduleNum{
  40. num: AModNum(resNum.Ok()),
  41. }
  42. return lev0.ResOk(IModNumFix(sf))
  43. }
  44. // Get -- получить номер модуля.
  45. func (sf *moduleNum) Get() AModNum {
  46. return sf.num
  47. }
  48. // String -- строковое представление номера модуля.
  49. func (sf *moduleNum) String() string {
  50. return fmt.Sprint(sf.num)
  51. }