1
0

3 Ревизии a00757d765 ... fe993b7d46

Автор SHA1 Съобщение Дата
  SVI fe993b7d46 SVI Рабочее сохранение преди 1 месец
  SVI 42d9e58dd1 SVI Рабочее сохранение преди 1 месец
  SVI 226f323eaa SVI Рабочее сохранение преди 1 месец
променени са 84 файла, в които са добавени 885 реда и са изтрити 880 реда
  1. 28 41
      v4/kern.go
  2. 6 6
      v4/kern_test.go
  3. 2 2
      v4/lev0/core_spec/ichan.go
  4. 0 19
      v4/lev0/core_spec/isafe_bool.go
  5. 0 14
      v4/lev0/core_spec/isafe_bool_react.go
  6. 74 18
      v4/lev0/defs/defs.go
  7. 101 0
      v4/lev0/defs/safe_bool/safe_bool.go
  8. 9 9
      v4/lev0/defs/safe_bool/safe_bool_test.go
  9. 133 0
      v4/lev0/defs/safe_bool_react/safe_bool_react.go
  10. 13 12
      v4/lev0/defs/safe_bool_react/safe_bool_react_test.go
  11. 148 0
      v4/lev0/defs/safe_num/safe_num.go
  12. 23 23
      v4/lev0/defs/safe_num/safe_num_test.go
  13. 25 18
      v4/lev0/defs/safe_txt/safe_txt.go
  14. 4 4
      v4/lev0/defs/safe_txt/safe_txt_test.go
  15. 73 28
      v4/lev0/lev0.go
  16. 2 2
      v4/lev1/comp_spec/ilocal_ctx.go
  17. 0 46
      v4/lev1/lev1.go
  18. 35 38
      v4/lev1/lev1_test.go
  19. 1 1
      v4/lev1/local_ctx/ctx_value/ctx_value.go
  20. 1 1
      v4/lev1/local_ctx/ctx_value/ctx_value_test.go
  21. 8 9
      v4/lev1/local_ctx/local_ctx.go
  22. 1 1
      v4/lev1/local_ctx/local_ctx_test.go
  23. 23 24
      v4/lev1/log_buf/log_buf.go
  24. 1 2
      v4/lev1/log_buf/log_buf_test.go
  25. 8 8
      v4/lev1/log_buf/log_msg/log_msg.go
  26. 4 4
      v4/lev1/lst_sort/lst_sort.go
  27. 4 4
      v4/lev1/mock_env/mock_env.go
  28. 0 97
      v4/lev1/safe_bool/safe_bool.go
  29. 0 129
      v4/lev1/safe_bool_react/safe_bool_react.go
  30. 0 152
      v4/lev1/safe_int/safe_int.go
  31. 9 10
      v4/lev2/kchan/kchan.go
  32. 1 1
      v4/lev2/kctx/kctx_test.go
  33. 1 1
      v4/lev2/kern_ent/stream_name/stream_name.go
  34. 1 2
      v4/lev2/kernel_keeper/kernel_keeper.go
  35. 6 6
      v4/lev2/kmodule/kmodule.go
  36. 3 4
      v4/lev2/kmodule/mod_stat/mod_stat.go
  37. 9 9
      v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day.go
  38. 8 8
      v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go
  39. 8 8
      v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go
  40. 4 4
      v4/lev2/kmonolit/kmonolit.go
  41. 6 6
      v4/lev2/kserv_http/kserv_http.go
  42. 6 7
      v4/lev2/kserv_http_std/kserv_http_std.go
  43. 1 1
      v4/lev2/kspec/ikernel_wg.go
  44. 5 6
      v4/lev2/kwg/kwg.go
  45. 6 7
      v4/lev2/lsi/kstore_kv/kstore_kv.go
  46. 1 1
      v4/lev2/lsi/kstore_kv/kstore_kv_test.go
  47. 4 4
      v4/lev2/lsi/kstore_kv_std/kv_bucket_base/kv_bucket_base.go
  48. 3 3
      v4/lev2/lsi/store_ent/dict_rec/dict_rec.go
  49. 1 1
      v4/lev2/lsi/store_ent/rec_key/store_key.go
  50. 3 3
      v4/lev2/lsi/store_spec/ibucket_base.go
  51. 1 1
      v4/lev2/lti/bus_ent/handler_name/handler_name.go
  52. 3 3
      v4/lev2/lti/bus_ent/topic/topic_let.go
  53. 2 3
      v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go
  54. 2 2
      v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go
  55. 1 1
      v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go
  56. 1 1
      v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub_test.go
  57. 2 2
      v4/lev2/lti/kbus_base/kbus_base.go
  58. 7 9
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go
  59. 1 1
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http_test.go
  60. 1 2
      v4/lev2/lti/kbus_http/kbus_http.go
  61. 1 1
      v4/lev2/lti/kbus_http/kbus_http_test.go
  62. 3 3
      v4/lev2/wui/hx_swap_oob/hx_swap_oob.go
  63. 3 3
      v4/lev2/wui/hx_target/hx_target.go
  64. 8 8
      v4/lev2/wui/hx_vals/hx_vals.go
  65. 1 1
      v4/lev2/wui/wui.go
  66. 2 2
      v4/lev2/wui/wui_button/wui_button.go
  67. 4 4
      v4/lev2/wui/wui_button/wui_button_test.go
  68. 1 1
      v4/lev2/wui/wui_test.go
  69. 1 1
      v4/lev2/wui/wui_types/ihx_swap_oob.go
  70. 2 2
      v4/lev2/wui/wui_types/ihx_target.go
  71. 4 4
      v4/lev2/wui/wui_types/ihx_vals.go
  72. 1 1
      v4/lev2/wui/wui_types/iwui_button.go
  73. 2 2
      v4/lev3/mod_ent/mod_num/mod_num.go
  74. 5 5
      v4/lev3/mod_ent/module_name/module_name.go
  75. 2 2
      v4/lev3/mod_serv_http/btn_modules/btn_modules.go
  76. 1 1
      v4/lev3/mod_serv_http/btn_modules/btn_modules_test.go
  77. 1 1
      v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go
  78. 1 1
      v4/lev3/mod_serv_http/btn_monolit/btn_monolit_test.go
  79. 1 1
      v4/lev3/mod_serv_http/page_module/page_module.go
  80. 1 1
      v4/lev3/mod_serv_http/page_module/page_module_test.go
  81. 1 1
      v4/lev3/mod_serv_http/page_monolit/page_monolit.go
  82. 1 1
      v4/lev3/mod_spec/imod_stat.go
  83. 3 3
      v4/lev3/mod_wui/mod_wui.go
  84. 1 1
      v4/lev3/mod_wui/mod_wui_test.go

+ 28 - 41
v4/kern.go

@@ -6,12 +6,8 @@ import (
 	"time"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1"
-
-	// "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
@@ -61,29 +57,27 @@ func WrapErr[T any](res *Result[T], err error) *Result[T] {
 }
 
 // GetKernelStoreKv -- возвращает быстрое key-value хранилище ядра.
-//
-
 func GetKernelStoreKv() store_spec.IKernelStoreKv {
 	store := kstore_kv.GetKernelStore()
 	return store
 }
 
 // GetKernelServerHttp -- возвращает веб-сервер ядра.
-//
-
 func GetKernelServerHttp() kspec.IKernelServerHttp {
 	kernServHttp := kserv_http.GetKernelServHttp()
 	return kernServHttp
 }
 
-type ISafeBool = core_spec.ISafeBool
+// Bool -- внутренее представление логического значения.
+type Bool = lev0.Bool
 
-// NewSafeBool -- возвращает новый потокобезопасный булевый признак.
-//
+// MSafeBool -- потокобезопасный булевый признак.
+type MSafeBool = lev0.MSafeBool
 
-func NewSafeBool(val defs.Bool) ISafeBool {
-	sb := mL1.NewSafeBool(val)
-	return sb
+// NewSafeBool -- возвращает новый потокобезопасный булевый признак.
+func MutSafeBool(val Bool) *MSafeBool {
+	sf := lev0.MutSafeBool(val)
+	return sf
 }
 
 // GetKernelBusLocal -- возвращает локальную шину данных.
@@ -157,10 +151,10 @@ func NewClientBusLocal() bus_spec.IBusClient {
 	return lClient
 }
 
-// NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP.
-//
+type LTxt = lev0.LTxt
 
-func NewClientBusHttp(url *defs.LTxt) bus_spec.IBusClient {
+// NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP.
+func NewClientBusHttp(url *LTxt) bus_spec.IBusClient {
 	client := client_bus_http.NewClientBusHttp(url)
 	return client
 }
@@ -201,57 +195,50 @@ func GetModuleWui() mod_spec.IKernelModule {
 type ILogBuf = comp_spec.ILogBuf
 
 // LogBufParam -- параметры для создания нового буферизованного лога.
-type LogBufParam = mL1.LogBufParam
+type LogBufParam = lev1.LogBufParam
 
 // NewLogBuf -- возвращает новый буферизованный лог.
-//
-
 func NewLogBuf(param *LogBufParam) ILogBuf {
-	log := mL1.NewLogBuf(param)
+	log := lev1.NewLogBuf(param)
 	return log
 }
 
-// NewSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную.
-//
+// MSafeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение.
+type MSafeBoolReact = lev0.MSafeBoolReact
 
-func NewSafeBoolReact() core_spec.ISafeBoolReact {
-	val := mL1.NewSafeBoolReact()
+// MutSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную.
+func MutSafeBoolReact() *MSafeBoolReact {
+	val := lev0.MutSafeBoolReact()
 	return val
 }
 
-// NewSafeInt -- возвращает новую потокобезопасную целочисленную переменную.
-//
-
-func NewSafeInt(val defs.Int) *lev1.MSafeInt {
-	val_ := mL1.MutSafeInt(val)
+// MutSafeNum -- возвращает новую потокобезопасную целочисленную переменную.
+func MutSafeNum(val defs.Num) *lev0.MSafeNum {
+	val_ := lev0.MutSafeNum(val)
 	return val_
 }
 
-// NewInt -- возвращает новую целочисленную переменную.
-//
-
-func LetInt(val lev0.Int) *lev0.LInt {
-	val_ := lev0.LetInt(val)
+// LetNum -- возвращает новую целочисленную переменную.
+func LetNum(val lev0.Num) *lev0.LNum {
+	val_ := lev0.LetNum(val)
 	return val_
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст.
-//
-
 func NewLocalCtx(ctx context.Context) comp_spec.ILocalCtx {
-	lCtx := mL1.NewLocalCtx(ctx)
+	lCtx := lev1.NewLocalCtx(ctx)
 	return lCtx
 }
 
 // TxtConstraint -- разрешает строки и любые типы на его основе (например, ATxt).
-type TxtConstraint=lev0.TxtConstraint
+type TxtConstraint = lev0.TxtConstraint
 
 // MSafeTxt -- потокобезопасный внутренний текст.
-type MSafeTxt=lev1.MSafeTxt
+type MSafeTxt = lev0.MSafeTxt
 
 // MutSafeTxt -- возвращает новую потокобезопасный текст.
 func MutSafeTxt[T TxtConstraint](txt T, arg ...any) *MSafeTxt {
-	str := mL1.MutSafeTxt(txt, arg...)
+	str := lev0.MutSafeTxt(txt, arg...)
 	return str
 }
 

+ 6 - 6
v4/kern_test.go

@@ -4,10 +4,10 @@ import (
 	"os"
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
 )
@@ -55,7 +55,7 @@ func (sf *tester) new() {
 	_ = NewSome("test err")
 	_ = NewNone[int64]()
 
-	valInt := LetInt(28)
+	valInt := LetNum(28)
 	if val := valInt.Get(); val != 28 {
 		sf.t.Fatalf("new(): cal(%v)!=28", val)
 	}
@@ -104,17 +104,17 @@ func (sf *tester) new2() {
 	}
 
 	param := &log_buf.LogBufParam{
-		IsTerm_: safe_bool.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 	}
 	logBuf := NewLogBuf(param)
 	if logBuf == nil {
 		sf.t.Fatalf("new2(): ILogBuf==nil")
 	}
-	boolReact := NewSafeBoolReact()
+	boolReact := MutSafeBoolReact()
 	if boolReact == nil {
 		sf.t.Fatalf("new2(): ISafeBoolReact==nil")
 	}
-	safeInt := NewSafeInt(12)
+	safeInt := MutSafeNum(12)
 	if safeInt == nil {
 		sf.t.Fatalf("new2(): ISafeInt==nil")
 	}
@@ -160,7 +160,7 @@ func (sf *tester) new0() {
 	if res.IsErr() {
 		sf.t.Fatalf("new0(): get empty key, store, err=%v", res.Err())
 	}
-	safeBool := NewSafeBool(true)
+	safeBool := lev0.MutSafeBool(true)
 	if safeBool == nil {
 		sf.t.Fatalf("new0(): ISafeBool==nil")
 	}

+ 2 - 2
v4/lev0/core_spec/ichan.go

@@ -10,9 +10,9 @@ type IChan[T any] interface {
 	// Read -- читает сообщение из канала.
 	Read() *result.Result[T]
 	// Limit -- лимит канала.
-	Limit() defs.Int
+	Limit() defs.Num
 	// Len -- количество сообщений в канале.
-	Len() defs.Int
+	Len() defs.Num
 	// Close -- закрыть канал.
 	Close()
 	// IsClosed -- проверяет закрыт ли канал.

+ 0 - 19
v4/lev0/core_spec/isafe_bool.go

@@ -1,19 +0,0 @@
-package core_spec
-
-import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
-)
-
-// ISafeBool -- интерфейс к потокобезопасной переменной.
-type ISafeBool interface {
-	// Get -- возвращает хранимое значение потокобезопасной переменной
-	Get() defs.Bool
-	// Set -- взводит хранимое потокобезопасное значение
-	Set()
-	// Reset -- сбрасывает хранимое потокобезопасное значение
-	Reset()
-	// FromStr -- устанавливает значение из строки
-	FromStr(*defs.LTxt) *defs.Option[*defs.LErr]
-	// Getenv -- получает значение из окружения
-	Getenv(*defs.LTxt) *defs.Option[*defs.LErr]
-}

+ 0 - 14
v4/lev0/core_spec/isafe_bool_react.go

@@ -1,14 +0,0 @@
-package core_spec
-
-import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
-)
-
-// ISafeBoolReact -- реактивный потокобезопасный булевый признак.
-type ISafeBoolReact interface {
-	ISafeBool
-	// Add -- добавляет функцию обратного вызова
-	Add(key *defs.LTxt, fn func(*defs.MBool)) *defs.Result[bool]
-	// Delete -- удаляет функцию обратного вызова по ключу
-	Delete(key *defs.LTxt)
-}

+ 74 - 18
v4/lev0/defs/defs.go

@@ -4,11 +4,15 @@ package defs
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_time"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_num"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_fn"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_time"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/safe_bool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/safe_bool_react"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/safe_num"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/safe_txt"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/option"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
@@ -32,30 +36,30 @@ func MutBool(val Bool) *MBool {
 	return def_bool.MutBool(val)
 }
 
-// Int -- внутренне представление числа.
-type Int = def_spec_base.Num
+// Num -- внутренне представление числа.
+type Num = def_spec_base.Num
 
-// LInt -- внутренне неизменяемое целое.
-type LInt = def_num.LNum
+// LNum -- внутренне неизменяемое число.
+type LNum = def_num.LNum
 
-// LetInt -- возвращает новое внутреннее неизменяемое целое.
-func LetInt(val Int) *LInt {
+// LetNum -- возвращает новое внутреннее неизменяемое число.
+func LetNum(val Num) *LNum {
 	return def_num.LetNum(val)
 }
 
-// MInt -- внутреннее изменяемое целое.
-type MInt = def_num.MNum
+// MNum -- внутреннее изменяемое число.
+type MNum = def_num.MNum
 
-// IntConstraint -- ограничение внутреннего целого.
-type IntConstraint = def_spec_base.NumConstraint
+// NumConstraint -- ограничение внутреннего целого.
+type NumConstraint = def_spec_base.NumConstraint
 
-// MutInt -- возвращает новое внутреннее изменяемое целое.
-func MutInt[T IntConstraint](val T) *MInt {
+// MutNum -- возвращает новое внутреннее изменяемое число.
+func MutNum[T NumConstraint](val T) *MNum {
 	return def_num.MutNum(val)
 }
 
-// ATxt -- внутренее представление текста.
-type ATxt = def_spec_base.Txt
+// Txt -- внутренее представление текста.
+type Txt = def_spec_base.Txt
 
 // TxtConstraint -- разрешает строки и любые типы на его основе (например, ATxt).
 type TxtConstraint = def_spec_fn.TxtConstraint
@@ -63,7 +67,7 @@ type TxtConstraint = def_spec_fn.TxtConstraint
 // LTxt -- внутренний неизменяемый текст.
 type LTxt = def_txt.LTxt
 
-// LetTxt -- создать новую неизменяемую строку.
+// LetTxt -- создать новую неизменяемый текст.
 func LetTxt[T TxtConstraint](msg T, arg ...any) *LTxt {
 	return def_txt.LetTxt(msg, arg...)
 }
@@ -146,11 +150,63 @@ func MutTimeAuto() *MTime {
 }
 
 // Sprintf -- форматирует строку с помощью fmt.Sprintf.
-func Sprintf[T TxtConstraint](val T, arg ...any) ATxt {
+func Sprintf[T TxtConstraint](val T, arg ...any) Txt {
 	return def_spec_fn.Sprintf(val, arg...)
 }
 
 // Atoi -- возвращает возможное число.
-func Atoi(val ATxt)*Result[Int]{
+func Atoi(val Txt) *Result[Num] {
 	return def_spec_fn.Atoi(val)
+}
+
+// MSafeNum -- потокобезопасное число.
+type MSafeNum = safe_num.MSafeNum
+
+// MutSafeNumFromTxt -- возвращает новое потокобезопасное число из текста.
+func MutSafeNumFromTxt[T TxtConstraint](strVal T) *Result[*MSafeNum] {
+	return safe_num.MutSafeNumFromTxt(strVal)
+}
+
+// MutSafeNumFromEnv -- возвращает новое потокобезопасное число из окружения.
+func MutSafeNumFromEnv(env *LTxt) *Result[*MSafeNum] {
+	return safe_num.MutSafeNumFromEnv(env)
+}
+
+// MutSafeNum -- возвращает новое потокобезопасное число.
+func MutSafeNum(val Num) *MSafeNum {
+	val_ := safe_num.MutSafeNum(val)
+	return val_
+}
+
+// MSafeTxt -- потокобезопасный внутренний текст.
+type MSafeTxt = safe_txt.MSafeTxt
+
+// MutSafeTxt -- возвращает новый потокобезопасный текст.
+func MutSafeTxt[T TxtConstraint](txt T, arg ...any) *MSafeTxt {
+	str := safe_txt.MutSafeTxt(txt, arg...)
+	return str
+}
+
+// MutSafeTxt -- возвращает новый потокобезопасный текст.
+func MutSafeTxtFromEnv(env *LTxt) *Result[*MSafeTxt] {
+	str := safe_txt.MutSafeTxtFromEnv(env)
+	return str
+}
+
+// MSafeBool -- потокобезопасный булевый признак.
+type MSafeBool=safe_bool.MSafeBool
+
+// MutSafeBool -- возвращает новый потокобезопасный булевый признак.
+func MutSafeBool(val Bool) *MSafeBool {
+	sf := safe_bool.MutSafeBool(val)
+	return sf
+}
+
+// MSafeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение.
+type MSafeBoolReact=safe_bool_react.MSafeBoolReact
+
+// MutSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную.
+func MutSafeBoolReact() *MSafeBoolReact {
+	val := safe_bool_react.MutSafeBoolReact()
+	return val
 }

+ 101 - 0
v4/lev0/defs/safe_bool/safe_bool.go

@@ -0,0 +1,101 @@
+// package safe_bool -- потокобезопасный булевый признак.
+package safe_bool
+
+import (
+	"os"
+	"strings"
+	"sync"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/option"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+)
+
+// MSafeBool -- потокобезопасный булевый признак.
+type MSafeBool struct {
+	sync.RWMutex
+	val def_spec_base.Bool
+}
+
+// MutSafeBool -- возвращает новый потокобезопасный булевый признак.
+func MutSafeBool[T def_spec_base.BoolConstraint](val T) *MSafeBool {
+	sf := &MSafeBool{
+		val: def_spec_base.Bool(val),
+	}
+	return sf
+}
+
+// MutSafeBoolFromTxt -- возвращает новое потокобезопасное булево из текста.
+func MutSafeBoolFromTxt(strVal *def_txt.LTxt) *result.Result[*MSafeBool] {
+	sf := MutSafeBool(false)
+	res := sf.FromTxt(strVal)
+	if res.IsSome() {
+		err := def_err.LetErr("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w",
+			strVal, res.Some().Get())
+		return result.ResErr[*MSafeBool](err)
+	}
+	return result.ResOk(sf)
+}
+
+// MutSafeBoolFromEnv -- возвращает новое потокобезопасное целое из окружения.
+func MutSafeBoolFromEnv(env *def_txt.LTxt) *result.Result[*MSafeBool] {
+	sf := MutSafeBool(false)
+	res := sf.Getenv(env)
+	if res.IsSome() {
+		err := def_err.LetErr("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Some().Get())
+		return result.ResErr[*MSafeBool](err)
+	}
+	return result.ResOk(sf)
+}
+
+// Get -- возвращает хранимый булевый признак.
+func (sf *MSafeBool) Get() def_spec_base.Bool {
+	sf.RLock()
+	defer sf.RUnlock()
+	return sf.val
+}
+
+// Set -- устанавливает булевый признак.
+func (sf *MSafeBool) Set() {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val = true
+}
+
+// Reset -- сбрасывает булевый признак.
+func (sf *MSafeBool) Reset() {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val = false
+}
+
+// FromTxt -- получает число из текста.
+func (sf *MSafeBool) FromTxt(strVal *def_txt.LTxt) *option.Option[*def_err.LErr] {
+	_strVal := strings.ToLower(strVal.String())
+	sf.Lock()
+	defer sf.Unlock()
+	switch _strVal {
+	case "true":
+		sf.val = true
+	case "false":
+		sf.val = false
+	default:
+		err := def_err.LetErr("MSafeBool.FromTxt(): val(%v) bad", strVal)
+		return option.NewSome(err)
+	}
+	return option.NewNone[*def_err.LErr]()
+}
+
+// Getenv -- получает значение из окружения.
+func (sf *MSafeBool) Getenv(env *def_txt.LTxt) *option.Option[*def_err.LErr] {
+	strVal := def_spec_base.Txt(os.Getenv(env.String()))
+	res := sf.FromTxt(def_txt.LetTxt(strVal))
+	if res.IsSome() {
+		err := def_err.LetErr("safeBool.Getenv(): from env %v, err=\n\t%w",
+			env, res.Some().Get())
+		return option.NewSome(err)
+	}
+	return option.NewNone[*def_err.LErr]()
+}

+ 9 - 9
v4/lev1/safe_bool/safe_bool_test.go → v4/lev0/defs/safe_bool/safe_bool_test.go

@@ -4,12 +4,12 @@ import (
 	"os"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
 )
 
 type tester struct {
 	t  *testing.T
-	sb lev0.ISafeBool
+	sb *MSafeBool
 }
 
 func TestSAfeBool(t *testing.T) {
@@ -32,7 +32,7 @@ func (sf *tester) newFromStr() {
 
 func (sf *tester) newFromStrGood1() {
 	sf.t.Log("newFromStrGood1")
-	res := NewSafeBoolFromStr(lev0.LetTxt("tRuE"))
+	res := MutSafeBoolFromTxt(def_txt.LetTxt("tRuE"))
 	if res.IsErr() {
 		sf.t.Fatalf("newFromStrGood1(): err=%v", res.Err())
 	}
@@ -45,7 +45,7 @@ func (sf *tester) newFromStrGood1() {
 // Кривое булево значение.
 func (sf *tester) newFromStrBad1() {
 	sf.t.Log("newFromStrBad1")
-	res := NewSafeBoolFromStr(lev0.LetTxt("0"))
+	res := MutSafeBoolFromTxt(def_txt.LetTxt("0"))
 	if res.IsOk() {
 		sf.t.Fatalf("newFromStrBad1(): err==nil")
 	}
@@ -59,13 +59,13 @@ func (sf *tester) newFromEnv() {
 	sf.newFromEnvGood2()
 }
 
-var testBool = lev0.LetTxt("TEST_BOOL")
+var testBool = def_txt.LetTxt("TEST_BOOL")
 
 func (sf *tester) newFromEnvGood2() {
 	sf.t.Log("newFromEnvGood2")
 	_ = os.Unsetenv(testBool.String())
 	_ = os.Setenv(testBool.String(), "false")
-	res := NewSafeBoolGetenv(testBool)
+	res := MutSafeBoolFromEnv(testBool)
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood2(): err=%v", res.Err())
 	}
@@ -79,7 +79,7 @@ func (sf *tester) newFromEnvGood1() {
 	sf.t.Log("newFromEnvGood1")
 	_ = os.Unsetenv(testBool.String())
 	_ = os.Setenv(testBool.String(), "true")
-	res := NewSafeBoolGetenv(testBool)
+	res := MutSafeBoolFromEnv(testBool)
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood1(): err=%v", res.Err())
 	}
@@ -94,7 +94,7 @@ func (sf *tester) newFromEnvBad1() {
 	sf.t.Log("newFromStrBad1")
 	_ = os.Unsetenv(testBool.String())
 	_ = os.Setenv(testBool.String(), "bad")
-	res := NewSafeBoolGetenv(testBool)
+	res := MutSafeBoolFromEnv(testBool)
 	if res.IsOk() {
 		sf.t.Fatalf("newFromStrBad1(): err==nil")
 	}
@@ -129,7 +129,7 @@ func (sf *tester) set() {
 // Создаёт потокобезопасный булевый признак.
 func (sf *tester) create() {
 	sf.t.Log("create")
-	sf.sb = NewSafeBool(false)
+	sf.sb = MutSafeBool(false)
 	if sf.sb == nil {
 		sf.t.Fatalf("create(): SafeBool==nil")
 	}

+ 133 - 0
v4/lev0/defs/safe_bool_react/safe_bool_react.go

@@ -0,0 +1,133 @@
+// package safe_bool_react -- потокобезопасный булевый признак с реакцией на своё изменение.
+package safe_bool_react
+
+import (
+	"os"
+	"strings"
+	"sync"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_bool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/option"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+)
+
+// MSafeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение.
+type MSafeBoolReact struct {
+	sync.RWMutex
+	dict map[*def_txt.LTxt]func(*def_bool.MBool) // Словарь обратных вызовов
+	val  def_spec_base.Bool
+}
+
+// MutSafeBoolReact -- возвращает новый потокобезопасный булевый признак с реакцией на своё изменение.
+func MutSafeBoolReact() *MSafeBoolReact {
+	sf := &MSafeBoolReact{
+		dict: map[*def_txt.LTxt]func(*def_bool.MBool){},
+	}
+	return sf
+}
+
+// MutSafeBoolReactFromTxt -- возвращает новое потокобезопасное булево с реакцией из строки.
+func MutSafeBoolReactFromTxt(txtVal *def_txt.LTxt) *result.Result[*MSafeBoolReact] {
+	sf := MutSafeBoolReact()
+	res := sf.FromTxt(txtVal)
+	if res.IsSome() {
+		err := def_err.LetErr("NewSafeBoolReactFromStr(): in parse str(%v), err=\n\t%w",
+			txtVal, res.Some().Get())
+		return result.ResErr[*MSafeBoolReact](err)
+	}
+	return result.ResOk(sf)
+}
+
+// MutSafeBoolReactFromEnv -- возвращает новое потокобезопасное целое с реакцией из окружения.
+func MutSafeBoolReactFromEnv(env *def_txt.LTxt) *result.Result[*MSafeBoolReact] {
+	sf := MutSafeBoolReact()
+	res := sf.FromEnv(env)
+	if res.IsSome() {
+		err := def_err.LetErr("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Some().Get())
+		return result.ResErr[*MSafeBoolReact](err)
+	}
+	return result.ResOk(sf)
+}
+
+// Delete -- удаляет функцию обратного вызова из наблюдения.
+func (sf *MSafeBoolReact) Delete(key *def_txt.LTxt) {
+	sf.Lock()
+	defer sf.Unlock()
+	delete(sf.dict, key)
+}
+
+// Add -- добавляет функцию обратного вызова.
+func (sf *MSafeBoolReact) Add(key *def_txt.LTxt, fn func(*def_bool.MBool)) *result.Result[bool] {
+	sf.Lock()
+	defer sf.Unlock()
+	if key.Get() == "" {
+		err := def_err.LetErr("safeBoolReact.Add(): key is empty")
+		return result.ResErr[bool](err)
+	}
+	_, isOk := sf.dict[key]
+	if isOk {
+		err := def_err.LetErr("safeBoolReact.Add(): key(%v) already exists", key)
+		return result.ResErr[bool](err)
+	}
+	sf.dict[key] = fn
+	return result.ResOk((true))
+}
+
+// Get -- возвращает хранимый булевый признак.
+func (sf *MSafeBoolReact) Get() def_spec_base.Bool {
+	sf.RLock()
+	defer sf.RUnlock()
+	return sf.val
+}
+
+// Set -- устанавливает булевый признак.
+func (sf *MSafeBoolReact) Set() {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val = true
+	for _, fn := range sf.dict {
+		fn(def_bool.MutBool(true))
+	}
+}
+
+// Reset -- сбрасывает булевый признак.
+func (sf *MSafeBoolReact) Reset() {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val = false
+	for _, fn := range sf.dict {
+		fn(def_bool.MutBool(false))
+	}
+}
+
+// FromTxt -- получает булево из текста.
+func (sf *MSafeBoolReact) FromTxt(txtVal *def_txt.LTxt) *option.Option[*def_err.LErr] {
+	_strVal := strings.ToLower(txtVal.String())
+	sf.Lock()
+	defer sf.Unlock()
+	switch _strVal {
+	case "true":
+		sf.val = true
+	case "false":
+		sf.val = false
+	default:
+		err := def_err.LetErr("safeBoolReact.FromStr(): val(%v) bad", txtVal)
+		return option.NewSome(err)
+	}
+	return option.NewNone[*def_err.LErr]()
+}
+
+// FromEnv -- получает значение из окружения.
+func (sf *MSafeBoolReact) FromEnv(env *def_txt.LTxt) *option.Option[*def_err.LErr] {
+	strVal := def_spec_base.Txt(os.Getenv(env.String()))
+	res := sf.FromTxt(def_txt.LetTxt(strVal))
+	if res.IsSome() {
+		err := def_err.LetErr("safeBoolReact.Getenv(): from env %v, err=\n\t%w",
+			env, res.Some().Get())
+		return option.NewSome(err)
+	}
+	return option.NewNone[*def_err.LErr]()
+}

+ 13 - 12
v4/lev1/safe_bool_react/safe_bool_react_test.go → v4/lev0/defs/safe_bool_react/safe_bool_react_test.go

@@ -4,13 +4,14 @@ import (
 	"os"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_bool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
 )
 
 type tester struct {
 	t   *testing.T
-	sbr lev0.ISafeBoolReact
-	val *lev0.MBool
+	sbr *MSafeBoolReact
+	val *def_bool.MBool
 }
 
 func TestSafeBoolReact(t *testing.T) {
@@ -35,7 +36,7 @@ func (sf *tester) newFromStr() {
 
 func (sf *tester) newFromStrGood1() {
 	sf.t.Log("newFromStrGood1")
-	res := NewSafeBoolReactFromStr(lev0.LetTxt("tRuE"))
+	res := MutSafeBoolReactFromTxt(def_txt.LetTxt("tRuE"))
 	if res.IsErr() {
 		sf.t.Fatalf("newFromStrGood1(): err=%v", res.Err())
 	}
@@ -48,7 +49,7 @@ func (sf *tester) newFromStrGood1() {
 // Кривое булево значение.
 func (sf *tester) newFromStrBad1() {
 	sf.t.Log("newFromStrBad1")
-	res := NewSafeBoolReactFromStr(lev0.LetTxt("0"))
+	res := MutSafeBoolReactFromTxt(def_txt.LetTxt("0"))
 	if res.IsOk() {
 		sf.t.Fatalf("newFromStrBad1(): err==nil")
 	}
@@ -62,13 +63,13 @@ func (sf *tester) newFromEnv() {
 	sf.newFromEnvGood2()
 }
 
-var testBool = lev0.LetTxt("TEST_BOOL")
+var testBool = def_txt.LetTxt("TEST_BOOL")
 
 func (sf *tester) newFromEnvGood2() {
 	sf.t.Log("newFromEnvGood2")
 	_ = os.Unsetenv(testBool.String())
 	_ = os.Setenv(testBool.String(), "false")
-	res := NewSafeBoolGetenv(testBool)
+	res := MutSafeBoolReactFromEnv(testBool)
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood2(): err=%v", res.Err())
 	}
@@ -82,7 +83,7 @@ func (sf *tester) newFromEnvGood1() {
 	sf.t.Log("newFromEnvGood1")
 	_ = os.Unsetenv(testBool.String())
 	_ = os.Setenv(testBool.String(), "true")
-	res := NewSafeBoolGetenv(testBool)
+	res := MutSafeBoolReactFromEnv(testBool)
 	if res.IsErr() {
 		sf.t.Fatalf("newFromEnvGood1(): err=%v", res.Err())
 	}
@@ -97,13 +98,13 @@ func (sf *tester) newFromEnvBad1() {
 	sf.t.Log("newFromStrBad1")
 	_ = os.Unsetenv(testBool.String())
 	_ = os.Setenv(testBool.String(), "bad")
-	res := NewSafeBoolGetenv(testBool)
+	res := MutSafeBoolReactFromEnv(testBool)
 	if res.IsOk() {
 		sf.t.Fatalf("newFromStrBad1(): err==nil")
 	}
 }
 
-var txtTest = lev0.LetTxt("test")
+var txtTest = def_txt.LetTxt("test")
 
 // Удаляет функцию обратного вызова.
 func (sf *tester) del() {
@@ -123,7 +124,7 @@ func (sf *tester) add() {
 }
 
 // Функция обратного вызова для контроля.
-func (sf *tester) fnBack(val *lev0.MBool) {
+func (sf *tester) fnBack(val *def_bool.MBool) {
 	sf.val = val
 }
 
@@ -163,7 +164,7 @@ func (sf *tester) set() {
 // Создаёт потокобезопасный булевый признак.
 func (sf *tester) create() {
 	sf.t.Log("create")
-	sf.sbr = NewSafeBoolReact()
+	sf.sbr = MutSafeBoolReact()
 	if sf.sbr == nil {
 		sf.t.Fatalf("create(): SafeBool==nil")
 	}

+ 148 - 0
v4/lev0/defs/safe_num/safe_num.go

@@ -0,0 +1,148 @@
+// package safe_num -- потокобезопасный число.
+package safe_num
+
+import (
+	"sync"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_num"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_fn"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+)
+
+// MSafeNum -- потокобезопасное число.
+type MSafeNum struct {
+	sync.RWMutex
+	val *def_num.MNum
+}
+
+// MutSafeNum -- возвращает новое потокобезопасное число.
+func MutSafeNum[T def_spec_base.NumConstraint](val T) *MSafeNum {
+	sf := &MSafeNum{
+		val: def_num.MutNum(val),
+	}
+	return sf
+}
+
+// MutSafeNumFromTxt -- возвращает новое потокобезопасное число из текста.
+func MutSafeNumFromTxt[T def_spec_base.TxtConstraint](txtVal T) *result.Result[*MSafeNum] {
+	res := def_spec_fn.Atoi(def_spec_base.Txt(txtVal))
+	if res.IsErr() {
+		err := def_err.LetErr("MutSafeNumFromTxt(): in parse str(%v), err=\n\t%w", txtVal, res.Err())
+		return result.ResErr[*MSafeNum](err)
+	}
+	_val := MutSafeNum(res.Ok())
+	return result.ResOk(_val)
+}
+
+// MutSafeNumFromEnv -- возвращает новое потокобезопасное число из окружения.
+func MutSafeNumFromEnv(env *def_txt.LTxt) *result.Result[*MSafeNum] {
+	sf := MutSafeNum(0)
+	res := sf.FromEnv(env)
+	if res.IsErr() {
+		err := def_err.LetErr("MutSafeNumFromEnv(): in parse env(%v), err=\n\t%w", env, res.Err())
+		return result.ResErr[*MSafeNum](err)
+	}
+	return result.ResOk(sf)
+}
+
+// FromBool -- устанавливает значение из булева значения.
+func (sf *MSafeNum) FromBool(val def_spec_base.Bool) def_spec_base.Num {
+	sf.Lock()
+	defer sf.Unlock()
+	if val {
+		sf.val.Set(1)
+		return 1
+	}
+	sf.val.Set(0)
+	return 0
+}
+
+// Get -- возвращает хранимое число.
+func (sf *MSafeNum) Get() def_spec_base.Num {
+	sf.RLock()
+	defer sf.RUnlock()
+	return sf.val.Get()
+}
+
+// Dec -- уменьшает значение на 1.
+func (sf *MSafeNum) Dec() {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val.Dec()
+}
+
+// Inc -- увеличивает значение на 1.
+func (sf *MSafeNum) Inc() {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val.Inc()
+}
+
+// Set -- устанавливает число.
+func (sf *MSafeNum) Set(val def_spec_base.Num) {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val.Set(val)
+}
+
+// Reset -- сбрасывает число.
+func (sf *MSafeNum) Reset() {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val.Reset()
+}
+
+// FromTxt -- получает число из текста.
+func (sf *MSafeNum) FromTxt(txtVal *def_txt.LTxt) *result.Result[def_spec_base.Num] {
+	sf.Lock()
+	defer sf.Unlock()
+	res := sf.val.FromTxt(txtVal)
+	if res.IsErr() {
+		err := def_err.LetErr("MSafeInt.FromStr(): form str(%v) to int, err=\n\t%v", txtVal, res.Error())
+		return result.ResErr[def_spec_base.Num](err)
+	}
+	return result.ResOk(sf.val.Get())
+}
+
+// FromByte -- получает число из среза байт.
+func (sf *MSafeNum) FromByte(binData []byte) *result.Result[def_spec_base.Num] {
+	sf.Lock()
+	defer sf.Unlock()
+	res := sf.val.FromByte(binData)
+	if res.IsErr() {
+		err := def_err.LetErr("MSafeInt.FromByte(): form binData(%v) to int", binData, res.Error())
+		return result.ResErr[def_spec_base.Num](err)
+	}
+	return result.ResOk(sf.val.Get())
+}
+
+// ToByte -- конвертирует число в срез байт.
+func (sf *MSafeNum) ToByte() []byte {
+	sf.RLock()
+	defer sf.RUnlock()
+	return sf.val.ToByte()
+}
+
+// ToBool -- конвертирует число в bool.
+func (sf *MSafeNum) ToBool() def_spec_base.Bool {
+	sf.RLock()
+	defer sf.RUnlock()
+	return sf.val.ToBool()
+}
+
+// Txt -- конвертирует число в текст.
+func (sf *MSafeNum) Txt() *def_txt.LTxt {
+	sf.RLock()
+	defer sf.RUnlock()
+	return sf.val.Txt()
+}
+
+// FromEnv -- получает значение из окружения.
+func (sf *MSafeNum) FromEnv(env *def_txt.LTxt) *result.Result[*def_num.LNum] {
+	sf.Lock()
+	defer sf.Unlock()
+	return sf.val.FromEnv(env)
+}

+ 23 - 23
v4/lev1/safe_int/safe_int_test.go → v4/lev0/defs/safe_num/safe_num_test.go

@@ -1,18 +1,18 @@
-package safe_int
+package safe_num
 
 import (
 	"os"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
 )
 
 type tester struct {
 	t  *testing.T
-	si *MSafeInt
+	si *MSafeNum
 }
 
-func TestSafeInt(t *testing.T) {
+func TestSafeNum(t *testing.T) {
 	sf := &tester{
 		t: t,
 	}
@@ -37,7 +37,7 @@ func TestSafeInt(t *testing.T) {
 
 func (sf *tester) byte() {
 	sf.t.Log("byte")
-	res := MutSafeInt(1234)
+	res := MutSafeNum(1234)
 	binData := res.ToByte()
 	if len(binData) != 8 {
 		sf.t.Fatalf("byte(): len val(%v)!='123''", len(binData))
@@ -52,7 +52,7 @@ func (sf *tester) byte() {
 
 func (sf *tester) toStr() {
 	sf.t.Log("toStr")
-	res := MutSafeInt(123)
+	res := MutSafeNum(123)
 	val := res.Txt()
 	if val.Get() != "123" {
 		sf.t.Fatalf("dec(): val(%v)!='123''", val)
@@ -61,7 +61,7 @@ func (sf *tester) toStr() {
 
 func (sf *tester) toBool() {
 	sf.t.Log("toBool")
-	res := MutSafeInt(0)
+	res := MutSafeNum(0)
 	val := res.ToBool()
 	if val {
 		sf.t.Fatalf("toBool(): val(%v)!=false", val)
@@ -70,7 +70,7 @@ func (sf *tester) toBool() {
 
 func (sf *tester) fromBool() {
 	sf.t.Log("fromBool")
-	res := MutSafeInt(12)
+	res := MutSafeNum(12)
 	val := res.FromBool(true)
 	if val != -1 {
 		sf.t.Fatalf("fromBool(): val(%v)!=-1", val)
@@ -79,7 +79,7 @@ func (sf *tester) fromBool() {
 
 func (sf *tester) dec() {
 	sf.t.Log("dec")
-	res := MutSafeInt(10)
+	res := MutSafeNum(10)
 	res.Dec()
 	if val := res.Get(); val != 9 {
 		sf.t.Fatalf("dec(): val(%v)!=9", val)
@@ -88,7 +88,7 @@ func (sf *tester) dec() {
 
 func (sf *tester) inc() {
 	sf.t.Log("inc")
-	res := MutSafeInt(52)
+	res := MutSafeNum(52)
 	res.Inc()
 	if val := res.Get(); val != 53 {
 		sf.t.Fatalf("inc(): val(%v)!=53", val)
@@ -98,11 +98,11 @@ func (sf *tester) inc() {
 // Получает целое из строки.
 func (sf *tester) newFromStr() {
 	sf.t.Log("newFromStr")
-	res := MutSafeIntFromStr(lev0.LetTxt("-a52"))
+	res := MutSafeNumFromTxt("-a52")
 	if res.IsOk() {
 		sf.t.Fatalf("newFromStr(): err==nil")
 	}
-	res = MutSafeIntFromStr(lev0.LetTxt("-60"))
+	res = MutSafeNumFromTxt("-60")
 	if res.IsErr() {
 		sf.t.Fatalf("newFromStr(): err=%v", res.Err())
 	}
@@ -111,18 +111,18 @@ func (sf *tester) newFromStr() {
 	}
 }
 
-var testEnv2 = lev0.LetTxt("TEST_ENV2")
+var testEnv2 = def_txt.LetTxt("TEST_ENV2")
 
 // Получает целое из окружения.
 func (sf *tester) newGetenv() {
 	sf.t.Log("newGetenv")
-	res := MutSafeIntGetenv(testEnv2)
+	res := MutSafeNumFromEnv(testEnv2)
 	if res.IsOk() {
 		sf.t.Fatalf("newGetenv(): err==nil")
 	}
 	_ = os.Unsetenv(testEnv2.String())
 	_ = os.Setenv(testEnv2.String(), "-52")
-	res = MutSafeIntGetenv(testEnv2)
+	res = MutSafeNumFromEnv(testEnv2)
 	if res.IsErr() {
 		sf.t.Fatalf("newGetenv(): err=%v", res.Err())
 	}
@@ -138,13 +138,13 @@ func (sf *tester) getEnv() {
 	sf.getEnvGood1()
 }
 
-var testVal = lev0.LetTxt("TEST_VAL")
+var testVal = def_txt.LetTxt("TEST_VAL")
 
 func (sf *tester) getEnvGood1() {
 	sf.t.Log("getEnvGood1")
 	_ = os.Unsetenv(testVal.String())
 	_ = os.Setenv(testVal.String(), "45")
-	val := MutSafeInt(0)
+	val := MutSafeNum(0)
 	res := val.FromEnv(testVal)
 	if res.IsErr() {
 		sf.t.Fatalf("getEnvGood1(): err=%v", res.Err())
@@ -159,7 +159,7 @@ func (sf *tester) getEnvBad1() {
 	sf.t.Log("getEnvBad1")
 	_ = os.Unsetenv(testVal.String())
 	_ = os.Setenv(testVal.String(), "")
-	val := MutSafeInt(0)
+	val := MutSafeNum(0)
 	res := val.FromEnv(testVal)
 	if res.IsOk() {
 		sf.t.Fatalf("getEnvBad1(): res==ok")
@@ -175,8 +175,8 @@ func (sf *tester) fromStr() {
 
 func (sf *tester) fromStrGood1() {
 	sf.t.Log("fromStrGood1")
-	val := MutSafeInt(0)
-	res := val.FromStr(lev0.LetTxt("45"))
+	val := MutSafeNum(0)
+	res := val.FromTxt(def_txt.LetTxt("45"))
 	if res.IsErr() {
 		sf.t.Fatalf("fromStrGood1(): err=%v", res.Err())
 	}
@@ -188,8 +188,8 @@ func (sf *tester) fromStrGood1() {
 // Строка не число.
 func (sf *tester) fromStrBad1() {
 	sf.t.Log("fromStrBad1")
-	val := MutSafeInt(0)
-	res := val.FromStr(lev0.LetTxt(" "))
+	val := MutSafeNum(0)
+	res := val.FromTxt(def_txt.LetTxt(" "))
 	if res.IsOk() {
 		sf.t.Fatalf("fromStrBad1(): res==ok")
 	}
@@ -224,7 +224,7 @@ func (sf *tester) set() {
 // Создаёт потокобезопасный булевый признак.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.si = MutSafeInt(0)
+	sf.si = MutSafeNum(0)
 	if sf.si == nil {
 		sf.t.Fatalf("new(): ISafeInt==nil")
 	}

+ 25 - 18
v4/lev1/safe_txt/safe_txt.go → v4/lev0/defs/safe_txt/safe_txt.go

@@ -5,32 +5,35 @@ import (
 	"os"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // MSafeTxt -- потокобезопасный внутренний текст.
 type MSafeTxt struct {
 	sync.RWMutex
-	val *lev0.MTxt
+	val *def_txt.MTxt
 }
 
 // MutSafeTxt -- возвращает новую потокобезопасный внутренний текст.
-func MutSafeTxt[T lev0.TxtConstraint](txt T, arg ...any) *MSafeTxt {
+func MutSafeTxt[T def_spec_base.TxtConstraint](txt T, arg ...any) *MSafeTxt {
 	sf := &MSafeTxt{
-		val: lev0.MutTxt(txt, arg...),
+		val: def_txt.MutTxt(txt, arg...),
 	}
 	return sf
 }
 
 // MutSafeTxtFromEnv -- возвращает новую потокобезопасный внутрений текст из окружения.
-func MutSafeTxtFromEnv(env *lev0.LTxt) *lev0.Result[*MSafeTxt] {
+func MutSafeTxtFromEnv(env *def_txt.LTxt) *result.Result[*MSafeTxt] {
 	sf := MutSafeTxt("")
 	res := sf.FromEnv(env)
 	if res.IsErr() {
-		err := lev0.LetErr("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err())
-		return lev0.ResErr[*MSafeTxt](err)
+		err := def_err.LetErr("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err())
+		return result.ResErr[*MSafeTxt](err)
 	}
-	return lev0.ResOk(sf)
+	return result.ResOk(sf)
 }
 
 // Byte -- возвращает байтовое представление текста.
@@ -41,20 +44,20 @@ func (sf *MSafeTxt) Byte() []byte {
 }
 
 // Get -- возвращает хранимый текст.
-func (sf *MSafeTxt) Get() *lev0.LTxt {
+func (sf *MSafeTxt) Get() *def_txt.LTxt {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.val.Let()
 }
 
 // Set -- устанавливает текст.
-func (sf *MSafeTxt) Set(val *lev0.LTxt) {
+func (sf *MSafeTxt) Set(val *def_txt.LTxt) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.val.Set(val.Get())
 }
 
-// Reset -- сбрасывает ьекст.
+// Reset -- сбрасывает текст.
 func (sf *MSafeTxt) Reset() {
 	sf.Lock()
 	defer sf.Unlock()
@@ -62,17 +65,21 @@ func (sf *MSafeTxt) Reset() {
 }
 
 // FromEnv -- получает значение из окружения.
-func (sf *MSafeTxt) FromEnv(env *lev0.LTxt) *lev0.Result[*lev0.LTxt] {
-	txtVal := lev0.ATxt(os.Getenv(env.String()))
+func (sf *MSafeTxt) FromEnv(env *def_txt.LTxt) *result.Result[*def_txt.LTxt] {
+	sf.Lock()
+	defer sf.Unlock()
+	txtVal := def_spec_base.Txt(os.Getenv(env.String()))
 	if txtVal == "" {
-		err := lev0.LetErr("safeString.Getenv(): from env(%v), val is empty", env)
-		return lev0.ResErr[*lev0.LTxt](err)
+		err := def_err.LetErr("safeString.Getenv(): from env(%v), val is empty", env)
+		return result.ResErr[*def_txt.LTxt](err)
 	}
-	sf.val = lev0.MutTxt(txtVal)
-	return lev0.ResOk(sf.val.Let())
+	sf.val = def_txt.MutTxt(txtVal)
+	return result.ResOk(sf.val.Let())
 }
 
 // TrimSuffix -- обрезает суффикс хранимаого текста
-func (sf *MSafeTxt) TrimSuffix(txt lev0.ATxt) lev0.ATxt {
+func (sf *MSafeTxt) TrimSuffix(txt def_spec_base.Txt) def_spec_base.Txt {
+	sf.Lock()
+	defer sf.Unlock()
 	return sf.val.TrimSuffix(txt)
 }

+ 4 - 4
v4/lev1/safe_txt/safe_txt_test.go → v4/lev0/defs/safe_txt/safe_txt_test.go

@@ -4,7 +4,7 @@ import (
 	"os"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
 )
 
 type tester struct {
@@ -30,7 +30,7 @@ func (sf *tester) newFromEnv() {
 	sf.newFromEnvGood2()
 }
 
-var testBool = lev0.LetTxt("TEST_BOOL")
+var testBool = def_txt.LetTxt("TEST_BOOL")
 
 func (sf *tester) newFromEnvGood2() {
 	sf.t.Log("newFromEnvGood2")
@@ -88,11 +88,11 @@ func (sf *tester) reset() {
 // Установка хранимого значения.
 func (sf *tester) set() {
 	sf.t.Log("set")
-	sf.ss.Set(lev0.LetTxt("77"))
+	sf.ss.Set(def_txt.LetTxt("77"))
 	if sf.ss.Get().Get() != "77" {
 		sf.t.Fatalf("set(): ISafeString!='77'")
 	}
-	sf.ss.Set(lev0.LetTxt("-56"))
+	sf.ss.Set(def_txt.LetTxt("-56"))
 	if sf.ss.Get().Get() != "-56" {
 		sf.t.Fatalf("set(): ISafeString!='-56'")
 	}

+ 73 - 28
v4/lev0/lev0.go

@@ -7,8 +7,8 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
-// ATxt -- внутренее представление текста.
-type ATxt = defs.ATxt
+// Txt -- внутренее представление текста.
+type Txt = defs.Txt
 
 // Bool -- внутренее представление логического значения.
 type Bool = defs.Bool
@@ -53,28 +53,27 @@ func MutTimeAuto() *MTime {
 	return defs.MutTimeAuto()
 }
 
-// Int -- внутренне представление числа.
-type Int = defs.Int
+// Num -- внутренне представление числа.
+type Num = defs.Num
 
-// LInt -- внутренне неизменяемое целое.
-type LInt = defs.LInt
+// LNum -- внутренне неизменяемое число.
+type LNum = defs.LNum
 
-// LetInt -- возвращает новое внутреннее неизменяемое целое.
-func LetInt(val Int) *LInt {
-	return defs.LetInt(val)
+// LetNum -- возвращает новое внутреннее неизменяемое число.
+func LetNum(val Num) *LNum {
+	return defs.LetNum(val)
 }
 
-// MInt -- внутреннее изменяемое целое.
-type MInt=defs.MInt
+// MNum -- внутреннее изменяемое число.
+type MNum = defs.MNum
 
-// IntConstraint -- ограничение внутреннего целого.
-type IntConstraint = defs.IntConstraint
+// NumConstraint -- ограничение внутреннего целого.
+type NumConstraint = defs.NumConstraint
 
-// MutInt -- возвращает новое внутреннее изменяемое целое.
-func MutInt[T IntConstraint](val T) *MInt {
-	return defs.MutInt(val)
+// MutNum -- возвращает новое внутреннее изменяемое число.
+func MutNum[T NumConstraint](val T) *MNum {
+	return defs.MutNum(val)
 }
-// LetInt -- возвращает новое внутреннее неизменяемое целое.
 
 // TxtConstraint -- разрешает строки и любые типы на его основе (например, ATxt).
 type TxtConstraint = defs.TxtConstraint
@@ -82,7 +81,7 @@ type TxtConstraint = defs.TxtConstraint
 // LTxt -- внутренний неизменяемый текст.
 type LTxt = defs.LTxt
 
-// LetTxt -- создать новую неизменяемую строку.
+// LetTxt -- создать новый неизменяемый текст.
 func LetTxt[T TxtConstraint](msgFormat T, arg ...any) *LTxt {
 	return defs.LetTxt(msgFormat, arg...)
 }
@@ -90,7 +89,7 @@ func LetTxt[T TxtConstraint](msgFormat T, arg ...any) *LTxt {
 // MTxt -- внутренний изменяемый текст.
 type MTxt = defs.MTxt
 
-// MutTxt -- создать новую изменяемую строку.
+// MutTxt -- создать новый изменяемый текст.
 func MutTxt[T TxtConstraint](msgFormat T, arg ...any) *MTxt {
 	return defs.MutTxt(msgFormat, arg...)
 }
@@ -147,26 +146,72 @@ func LetErr[T TxtConstraint](msg T, arg ...any) *LErr {
 	return defs.LetErr(msg, arg...)
 }
 
-// ISafeBool -- интерфейс к потокобезопасной переменной.
-type ISafeBool = core_spec.ISafeBool
-
 // IChan -- умный канал.
 type IChan[T any] = core_spec.IChan[T]
 
-// ISafeBoolReact -- реактивный потокобезопасный булевый признак.
-type ISafeBoolReact = core_spec.ISafeBoolReact
-
 type IRWMutex = core_spec.IRWMutex
 
 // Sprintf -- форматирует строку с помощью fmt.Sprintf.
-func Sprintf[T TxtConstraint](val T, arg ...any) ATxt {
+func Sprintf[T TxtConstraint](val T, arg ...any) Txt {
 	return defs.Sprintf(val, arg...)
 }
 
 // BucketName -- имя сущности.
-type BucketName=defs.BucketName
+type BucketName = defs.BucketName
 
 // Atoi -- возвращает возможное число.
-func Atoi(val ATxt)*Result[Int]{
+func Atoi(val Txt) *Result[Num] {
 	return defs.Atoi(val)
 }
+
+// MSafeNum -- потокобезопасное число.
+type MSafeNum = defs.MSafeNum
+
+// MutSafeNumFromTxt -- возвращает новое потокобезопасное число из текста.
+func MutSafeNumFromTxt[T TxtConstraint](strVal T) *Result[*MSafeNum] {
+	return defs.MutSafeNumFromTxt(strVal)
+}
+
+// MutSafeNumFromEnv -- возвращает новое потокобезопасное число из окружения.
+func MutSafeNumFromEnv(env *LTxt) *Result[*MSafeNum] {
+	return defs.MutSafeNumFromEnv(env)
+}
+
+// MutSafeNum -- возвращает новое потокобезопасное число.
+func MutSafeNum(val Num) *MSafeNum {
+	val_ := defs.MutSafeNum(val)
+	return val_
+}
+
+// MSafeTxt -- потокобезопасный внутренний текст.
+type MSafeTxt = defs.MSafeTxt
+
+// MutSafeTxt -- возвращает новый потокобезопасный текст.
+func MutSafeTxt[T TxtConstraint](txt T, arg ...any) *MSafeTxt {
+	str := defs.MutSafeTxt(txt, arg...)
+	return str
+}
+
+// MutSafeTxt -- возвращает новый потокобезопасный текст.
+func MutSafeTxtFromEnv(env *LTxt) *Result[*MSafeTxt] {
+	str := defs.MutSafeTxtFromEnv(env)
+	return str
+}
+
+// MSafeBool -- потокобезопасный булевый признак.
+type MSafeBool = defs.MSafeBool
+
+// MutSafeBool -- возвращает новый потокобезопасный булевый признак.
+func MutSafeBool(val Bool) *MSafeBool {
+	sf := defs.MutSafeBool(val)
+	return sf
+}
+
+// MSafeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение.
+type MSafeBoolReact=defs.MSafeBoolReact
+
+// MutSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную.
+func MutSafeBoolReact() *MSafeBoolReact {
+	val := defs.MutSafeBoolReact()
+	return val
+}

+ 2 - 2
v4/lev1/comp_spec/ilocal_ctx.go

@@ -19,9 +19,9 @@ type ILocalCtx interface {
 	// Del -- удаляет значение из контекста
 	Del(key *lev0.LTxt)
 	// Set -- добавляет значение в контекст
-	Set(key *lev0.LTxt, val any, comment lev0.ATxt)
+	Set(key *lev0.LTxt, val any, comment lev0.Txt)
 	// Size -- возвращает размер словаря контекста
-	Size() lev0.Int
+	Size() lev0.Num
 	// SortedList -- возвращает сортированный список объектов контекста
 	SortedList() []ICtxValue
 	// Cancel -- отменяет контекст

+ 0 - 46
v4/lev1/lev1.go

@@ -5,16 +5,10 @@ import (
 	"context"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool_react"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_int"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_txt"
 )
 
 type IMockEnv = mock_env.IMockEnv
@@ -34,46 +28,6 @@ func NewLogBuf(param *LogBufParam) comp_spec.ILogBuf {
 	return log
 }
 
-// MSafeTxt -- потокобезопасный внутренний текст.
-type MSafeTxt=safe_txt.MSafeTxt
-
-// MutSafeTxt -- возвращает новый потокобезопасный текст.
-func MutSafeTxt[T lev0.TxtConstraint](txt T, arg ...any) *MSafeTxt {
-	str := safe_txt.MutSafeTxt(txt, arg...)
-	return str
-}
-
-// MSafeInt -- потокобезопасное целое.
-type MSafeInt = safe_int.MSafeInt
-
-// MutSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
-func MutSafeIntFromStr(strVal *lev0.LTxt) *lev0.Result[*MSafeInt] {
-	return safe_int.MutSafeIntFromStr(strVal)
-}
-
-// MutSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
-func MutSafeIntGetenv(env *lev0.LTxt) *lev0.Result[*MSafeInt] {
-	return safe_int.MutSafeIntGetenv(env)
-}
-
-// MutSafeInt -- возвращает новую потокобезопасную целочисленную переменную.
-func MutSafeInt(val lev0.Int) *MSafeInt {
-	val_ := safe_int.MutSafeInt(val)
-	return val_
-}
-
-// NewSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную.
-func NewSafeBoolReact() lev0.ISafeBoolReact {
-	val := safe_bool_react.NewSafeBoolReact()
-	return val
-}
-
-// NewSafeBool -- возвращает новый потокобезопасный булевый признак.
-func NewSafeBool(val lev0.Bool) lev0.ISafeBool {
-	sb := safe_bool.NewSafeBool(val)
-	return sb
-}
-
 // SleepMs -- спит миллисекунду.
 func SleepMs() {
 	time.Sleep(time.Millisecond * 1)

+ 35 - 38
v4/lev1/lev1_test.go

@@ -3,9 +3,6 @@ package lev1
 
 import (
 	"testing"
-
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 )
 
 type tester struct {
@@ -17,46 +14,46 @@ func TestLev1(t *testing.T) {
 		t: t,
 	}
 	sf.makeEnv()
-	sf.newLogBuf()
-	sf.newSafeString()
-	sf.newSafeIntFromStr()
-	sf.newSafeIntGetenv()
+//	sf.newLogBuf()
+//	sf.newSafeString()
+//	sf.newSafeIntFromStr()
+// 	sf.newSafeIntGetenv()
 }
 
-func (sf *tester) newSafeIntGetenv() {
-	sf.t.Log("newSafeIntGetenv")
-	safeInt := MutSafeIntGetenv(lev0.LetTxt("test_env"))
-	if safeInt == nil {
-		sf.t.Fatalf("newSafeIntGetenv(): safeInt==nil")
-	}
-}
+// func (sf *tester) newSafeIntGetenv() {
+// 	sf.t.Log("newSafeIntGetenv")
+// 	safeInt := MutSafeIntGetenv(lev0.LetTxt("test_env"))
+// 	if safeInt == nil {
+// 		sf.t.Fatalf("newSafeIntGetenv(): safeInt==nil")
+// 	}
+// }
 
-func (sf *tester) newSafeIntFromStr() {
-	sf.t.Log("newSafeIntFromStr")
-	safeInt := MutSafeIntFromStr(lev0.LetTxt("123"))
-	if safeInt == nil {
-		sf.t.Fatalf("newSafeIntFromStr(): safeInt==nil")
-	}
-}
+// func (sf *tester) newSafeIntFromStr() {
+// 	sf.t.Log("newSafeIntFromStr")
+// 	safeInt := MutSafeIntFromStr(lev0.LetTxt("123"))
+// 	if safeInt == nil {
+// 		sf.t.Fatalf("newSafeIntFromStr(): safeInt==nil")
+// 	}
+// }
 
-func (sf *tester) newSafeString() {
-	sf.t.Log("newSafeString")
-	safeString := MutSafeTxt("test string")
-	if safeString == nil {
-		sf.t.Fatalf("newSafeString(): safeString==nil")
-	}
-}
+// func (sf *tester) newSafeString() {
+// 	sf.t.Log("newSafeString")
+// 	safeString := MutSafeTxt("test string")
+// 	if safeString == nil {
+// 		sf.t.Fatalf("newSafeString(): safeString==nil")
+// 	}
+// }
 
-func (sf *tester) newLogBuf() {
-	sf.t.Log("newLogBuf")
-	param := &LogBufParam{
-		IsTerm_: safe_bool.NewSafeBool(true),
-	}
-	logBuf := NewLogBuf(param)
-	if logBuf == nil {
-		sf.t.Fatalf("newLogBuf(): logBuf==nil")
-	}
-}
+// func (sf *tester) newLogBuf() {
+// 	sf.t.Log("newLogBuf")
+// 	param := &LogBufParam{
+// 		IsTerm_: safe_bool.MutSafeBool(true),
+// 	}
+// 	logBuf := NewLogBuf(param)
+// 	if logBuf == nil {
+// 		sf.t.Fatalf("newLogBuf(): logBuf==nil")
+// 	}
+// }
 
 func (sf *tester) makeEnv() {
 	sf.t.Log("makeEnv")

+ 1 - 1
v4/lev1/local_ctx/ctx_value/ctx_value.go

@@ -34,7 +34,7 @@ type CtxValue struct {
 }
 
 // NewCtxValue -- возвращает новое потокобезопасное значение локального контекста.
-func NewCtxValue[T lev0.TxtConstraint](key lev0.ATxt, val any, comment T) ICtxValue {
+func NewCtxValue[T lev0.TxtConstraint](key lev0.Txt, val any, comment T) ICtxValue {
 	lev0.If(key == "").Hassert("NewCtxValue(): key is empty", []any{})
 	sf := &CtxValue{
 		key:       lev0.LetTxt(key),

+ 1 - 1
v4/lev1/local_ctx/ctx_value/ctx_value_test.go

@@ -26,7 +26,7 @@ func (sf *tester) new() {
 	if sf.val == nil {
 		sf.t.Fatalf("new(): val==nil")
 	}
-	if val := sf.val.Val().(lev0.Int); val != 5 {
+	if val := sf.val.Val().(lev0.Num); val != 5 {
 		sf.t.Fatalf("new(): val(%v)!=5", val)
 	}
 	createdAt := sf.val.CreateAt()

+ 8 - 9
v4/lev1/local_ctx/local_ctx.go

@@ -10,7 +10,6 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx/ctx_value"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/lst_sort"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 )
 
 // ILocalCtx -- локальный контекст.
@@ -21,9 +20,9 @@ type ILocalCtx interface {
 	// Del -- удаляет значение из контекста
 	Del(key *lev0.LTxt)
 	// Set -- добавляет значение в контекст
-	Set(key *lev0.LTxt, val any, comment lev0.ATxt)
+	Set(key *lev0.LTxt, val any, comment lev0.Txt)
 	// Size -- возвращает размер словаря контекста
-	Size() lev0.Int
+	Size() lev0.Num
 	// SortedList -- возвращает сортированный список объектов контекста
 	SortedList() []comp_spec.ICtxValue
 	// Cancel -- отменяет контекст
@@ -42,7 +41,7 @@ type LocalCtx struct {
 	ctx      context.Context // Отменяемый контекст
 	fnCancel func()          // Функция отмены контекста
 
-	dictVal map[lev0.ATxt]comp_spec.ICtxValue // Словарь различных значений
+	dictVal map[lev0.Txt]comp_spec.ICtxValue // Словарь различных значений
 	lstSort *lst_sort.LstSort                 // Сортированный список значений
 	log     comp_spec.ILogBuf                 // Локальный буфер
 }
@@ -52,13 +51,13 @@ func NewLocalCtx(ctx context.Context) ILocalCtx {
 	lev0.If(ctx == nil).Hassert("NewLocalCtx(): ctx==nil", []any{})
 	_ctx, fnCancel := context.WithCancel(ctx)
 	paramLogBuf := &log_buf.LogBufParam{
-		IsTerm_: safe_bool.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 		Prefix_: lev0.LetTxt("LocalCtx"),
 	}
 	sf := &LocalCtx{
 		ctx:      _ctx,
 		fnCancel: fnCancel,
-		dictVal:  map[lev0.ATxt]comp_spec.ICtxValue{},
+		dictVal:  map[lev0.Txt]comp_spec.ICtxValue{},
 		lstSort:  lst_sort.NewLstSort(),
 		log:      log_buf.NewLogBuf(paramLogBuf),
 	}
@@ -71,10 +70,10 @@ func (sf *LocalCtx) Ctx() context.Context {
 }
 
 // Size -- возвращает размер контекста.
-func (sf *LocalCtx) Size() lev0.Int {
+func (sf *LocalCtx) Size() lev0.Num {
 	sf.RLock()
 	defer sf.RUnlock()
-	return lev0.Int(len(sf.dictVal))
+	return lev0.Num(len(sf.dictVal))
 }
 
 // SortedList -- возвращает сортированный список значений.
@@ -115,7 +114,7 @@ func (sf *LocalCtx) Del(key *lev0.LTxt) {
 }
 
 // Set -- добавляет значение в контекст.
-func (sf *LocalCtx) Set(key *lev0.LTxt, val any, comment lev0.ATxt) {
+func (sf *LocalCtx) Set(key *lev0.LTxt, val any, comment lev0.Txt) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := lev0.LetTxt("Set(): key='%v'", key).Get()

+ 1 - 1
v4/lev1/local_ctx/local_ctx_test.go

@@ -43,7 +43,7 @@ func (sf *tester) get() {
 	sf.t.Log("get")
 	optRes := sf.lCtx.Get(lev0.LetTxt("count"))
 	ctxVal := optRes.Hassert("get()")
-	count := ctxVal.Val().(lev0.Int)
+	count := ctxVal.Val().(lev0.Num)
 	if count == 15 {
 		return
 	}

+ 23 - 24
v4/lev1/log_buf/log_buf.go

@@ -7,7 +7,6 @@ import (
 	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf/log_msg"
 )
@@ -17,29 +16,29 @@ import (
 //	Буфер для Error -- отдельный.
 type ILogBuf interface {
 	// Debug -- сообщение отладки
-	Debug(fMsg lev0.ATxt, args ...any)
+	Debug(fMsg lev0.Txt, args ...any)
 	// LogBus -- возвращает объект публикации в шину
 	// LogBus()ILogBus
 	// Info -- информационные сообщения
-	Info(fMsg lev0.ATxt, args ...any)
+	Info(fMsg lev0.Txt, args ...any)
 	// Warn -- предупреждающие сообщения
-	Warn(fMsg lev0.ATxt, args ...any)
+	Warn(fMsg lev0.Txt, args ...any)
 	// Err -- сообщения об ошибках
 	Err(fMsg *lev0.LErr, args ...any)
 	// Get -- возвращает сообщение по номеру (0..99)
-	Get(num lev0.Int) log_msg.ILogMsg
+	Get(num lev0.Num) log_msg.ILogMsg
 	// GetErr -- возвращает сообщение ошибки по номеру (0..99)
-	GetErr(num lev0.Int) log_msg.ILogMsg
+	GetErr(num lev0.Num) log_msg.ILogMsg
 	// Size -- возвращает размер лога
-	Size() lev0.Int
+	Size() lev0.Num
 	// IsTerm -- возвращает признак логирования в терминал
-	IsTerm() lev0.ISafeBool
+	IsTerm() *lev0.MSafeBool
 }
 
 // LogBufParam -- параметры логирующего буфера.
 type LogBufParam struct {
 	Prefix_ *lev0.LTxt        // Префикс для сообщений
-	IsTerm_ core_spec.ISafeBool // Признак вывода в терминал
+	IsTerm_ *lev0.MSafeBool // Признак вывода в терминал
 }
 
 // SelfCheck -- проверяет корректность параметров.
@@ -64,25 +63,25 @@ func NewLogBuf(param *LogBufParam) ILogBuf {
 		lst:         []log_msg.ILogMsg{},
 		lstErr:      []log_msg.ILogMsg{},
 	}
-	pref := sf.Prefix_.Get() + lev0.ATxt(".")
+	pref := sf.Prefix_.Get() + lev0.Txt(".")
 	sf.Prefix_ = lev0.LetTxt(pref)
 	return sf
 }
 
 // IsTerm -- возвращает признак логирования.
-func (sf *LogBuf) IsTerm() core_spec.ISafeBool {
+func (sf *LogBuf) IsTerm() *lev0.MSafeBool {
 	return sf.IsTerm_
 }
 
 // GetErr -- возвращает сообщение ошибки по номеру.
-func (sf *LogBuf) GetErr(num lev0.Int) log_msg.ILogMsg {
+func (sf *LogBuf) GetErr(num lev0.Num) log_msg.ILogMsg {
 	sf.RLock()
 	defer sf.RUnlock()
 	if len(sf.lstErr) == 0 {
 		msg := sf.Prefix_.Get() + "not error msg"
 		return log_msg.NewLogMsg(log_msg.DEBUG, msg)
 	}
-	if num >= lev0.Int(len(sf.lstErr)) {
+	if num >= lev0.Num(len(sf.lstErr)) {
 		return sf.lstErr[len(sf.lstErr)-1]
 	}
 	if num <= 0 {
@@ -92,14 +91,14 @@ func (sf *LogBuf) GetErr(num lev0.Int) log_msg.ILogMsg {
 }
 
 // Get -- возвращает сообщение по номеру.
-func (sf *LogBuf) Get(num lev0.Int) log_msg.ILogMsg {
+func (sf *LogBuf) Get(num lev0.Num) log_msg.ILogMsg {
 	sf.RLock()
 	defer sf.RUnlock()
 	msg := sf.Prefix_.Get() + "*no msg*"
 	if len(sf.lst) == 0 {
 		return log_msg.NewLogMsg(log_msg.DEBUG, msg)
 	}
-	if num >= lev0.Int(len(sf.lst)) {
+	if num >= lev0.Num(len(sf.lst)) {
 		return log_msg.NewLogMsg(log_msg.DEBUG, msg)
 	}
 	if num <= 0 {
@@ -109,11 +108,11 @@ func (sf *LogBuf) Get(num lev0.Int) log_msg.ILogMsg {
 }
 
 // Debug -- сообщение отладки.
-func (sf *LogBuf) Debug(fTxt lev0.ATxt, args ...any) {
+func (sf *LogBuf) Debug(fTxt lev0.Txt, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	strMsg := lev0.Sprintf(fTxt, args...)
-	msg := sf.Prefix_.Get() + lev0.ATxt(strMsg)
+	msg := sf.Prefix_.Get() + lev0.Txt(strMsg)
 	_msg := log_msg.NewLogMsg(log_msg.DEBUG, msg)
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
@@ -121,11 +120,11 @@ func (sf *LogBuf) Debug(fTxt lev0.ATxt, args ...any) {
 }
 
 // Info -- информационные сообщения.
-func (sf *LogBuf) Info(fMsg lev0.ATxt, args ...any) {
+func (sf *LogBuf) Info(fMsg lev0.Txt, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	strMsg := lev0.Sprintf(fMsg, args...)
-	msg := sf.Prefix_.Get() + lev0.ATxt(strMsg)
+	msg := sf.Prefix_.Get() + lev0.Txt(strMsg)
 	_msg := log_msg.NewLogMsg(log_msg.INFO, msg)
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
@@ -133,11 +132,11 @@ func (sf *LogBuf) Info(fMsg lev0.ATxt, args ...any) {
 }
 
 // Warn -- предупреждающие сообщения.
-func (sf *LogBuf) Warn(fMsg lev0.ATxt, args ...any) {
+func (sf *LogBuf) Warn(fMsg lev0.Txt, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	strMsg := lev0.Sprintf(fMsg, args...)
-	msg := sf.Prefix_.Get() + lev0.ATxt(strMsg)
+	msg := sf.Prefix_.Get() + lev0.Txt(strMsg)
 	_msg := log_msg.NewLogMsg(log_msg.WARN, msg)
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
@@ -149,7 +148,7 @@ func (sf *LogBuf) Err(err *lev0.LErr, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	strMsg := fmt.Sprintf(err.String(), args...)
-	msg := sf.Prefix_.Get() + lev0.ATxt(strMsg)
+	msg := sf.Prefix_.Get() + lev0.Txt(strMsg)
 	_msg := log_msg.NewLogMsg(log_msg.ERROR, msg)
 	sf.lst = append(sf.lst, _msg)
 	sf.lstErr = append(sf.lstErr, _msg)
@@ -159,10 +158,10 @@ func (sf *LogBuf) Err(err *lev0.LErr, args ...any) {
 }
 
 // Size -- возвращает размер буфера.
-func (sf *LogBuf) Size() lev0.Int {
+func (sf *LogBuf) Size() lev0.Num {
 	sf.RLock()
 	defer sf.RUnlock()
-	return lev0.Int(len(sf.lst))
+	return lev0.Num(len(sf.lst))
 }
 
 // Проверяет длину общую лога.

+ 1 - 2
v4/lev1/log_buf/log_buf_test.go

@@ -5,7 +5,6 @@ import (
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 )
 
 type tester struct {
@@ -24,7 +23,7 @@ func TestLogBuf(t *testing.T) {
 func (sf *tester) new() {
 	sf.t.Log("new")
 	param := &LogBufParam{
-		IsTerm_: safe_bool.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 		Prefix_: lev0.LetTxt("tester"),
 	}
 	sf.log = NewLogBuf(param)

+ 8 - 8
v4/lev1/log_buf/log_msg/log_msg.go

@@ -23,22 +23,22 @@ type ILogMsg interface {
 }
 
 const (
-	DEBUG  = lev0.Int(-4)
-	INFO   = lev0.Int(-3)
-	WARN   = lev0.Int(-2)
-	ERROR  = lev0.Int(-1)
-	NOTSET = lev0.Int(0)
+	DEBUG  = lev0.Num(-4)
+	INFO   = lev0.Num(-3)
+	WARN   = lev0.Num(-2)
+	ERROR  = lev0.Num(-1)
+	NOTSET = lev0.Num(0)
 )
 
 // logMsg -- сообщение логгера.
 type logMsg struct {
 	level     *lev0.MTxt
 	createdAt *lev0.LTime
-	msg       lev0.ATxt
+	msg       lev0.Txt
 }
 
 // NewLogMsg -- возвращает новое сообщение логгера.
-func NewLogMsg(level lev0.Int, msg lev0.ATxt) ILogMsg {
+func NewLogMsg(level lev0.Num, msg lev0.Txt) ILogMsg {
 	sf := &logMsg{
 		createdAt: lev0.LetTimeAuto(),
 		msg:       msg,
@@ -70,7 +70,7 @@ func (sf *logMsg) CreateAt() *lev0.LTime {
 }
 
 // Проверяет правильность своего состава.
-func (sf *logMsg) check(level lev0.Int) {
+func (sf *logMsg) check(level lev0.Num) {
 	switch level {
 	case DEBUG:
 		sf.level.Set("DEBU")

+ 4 - 4
v4/lev1/lst_sort/lst_sort.go

@@ -51,18 +51,18 @@ func (sf *LstSort) List() []comp_spec.ICtxValue {
 }
 
 // Size -- возвращает длину списка.
-func (sf *LstSort) Size() defs.Int {
+func (sf *LstSort) Size() defs.Num {
 	sf.RLock()
 	defer sf.RUnlock()
-	return defs.Int(len(sf.lstVal))
+	return defs.Num(len(sf.lstVal))
 }
 
 // Get -- возвращает по индексу.
-func (sf *LstSort) Get(ind defs.Int) comp_spec.ICtxValue {
+func (sf *LstSort) Get(ind defs.Num) comp_spec.ICtxValue {
 	sf.RLock()
 	defer sf.RUnlock()
 	helpers.If(ind < 0).Hassert("LstSort.Get(): ind(%v)<0", []any{ind})
-	helpers.If(ind >= defs.Int(len(sf.lstVal))).Hassert("LstSort.Get(): ind(%v)>=len(%v)", []any{ind, len(sf.lstVal)})
+	helpers.If(ind >= defs.Num(len(sf.lstVal))).Hassert("LstSort.Get(): ind(%v)>=len(%v)", []any{ind, len(sf.lstVal)})
 	return sf.lstVal[ind]
 }
 

+ 4 - 4
v4/lev1/mock_env/mock_env.go

@@ -16,7 +16,7 @@ type IMockEnv interface {
 
 // MockEnv -- объект мок-окружения.
 type MockEnv struct {
-	dictEnv  map[lev0.ATxt]*lev0.LTxt // Словарь переменных окружения
+	dictEnv  map[lev0.Txt]*lev0.LTxt // Словарь переменных окружения
 	pwd      *lev0.LTxt               // Текущий путь процесса
 	fileName *lev0.LTxt               // Полный путь к .env файлу
 	strEnv   *lev0.LTxt               // Фактическое содержимое .env файла
@@ -25,7 +25,7 @@ type MockEnv struct {
 // MakeEnv -- возвращает новое мок-окружение.
 func MakeEnv() *MockEnv {
 	sf := &MockEnv{
-		dictEnv: map[lev0.ATxt]*lev0.LTxt{},
+		dictEnv: map[lev0.Txt]*lev0.LTxt{},
 	}
 	sf.setPath()
 	sf.readEnv()
@@ -64,7 +64,7 @@ func (sf *MockEnv) parseEnvStr(pair *lev0.LTxt) {
 	val = strings.TrimSuffix(val, "=")
 
 	lev0.If(val == "").Hassert("MockEnv.parseEnvStr(): in pair(%v) val is empty", []any{pair})
-	sf.dictEnv[lev0.ATxt(key)] = lev0.LetTxt(val)
+	sf.dictEnv[lev0.Txt(key)] = lev0.LetTxt(val)
 }
 
 // Читает файл переменных окружения.
@@ -73,7 +73,7 @@ func (sf *MockEnv) readEnv() {
 	lev0.If(err != nil).
 		Hassert("MockEnv.readEnv(): in read %v, err=\n\t%v", []any{sf.fileName,
 			err})
-	sf.strEnv = lev0.LetTxt(lev0.ATxt(binEnv))
+	sf.strEnv = lev0.LetTxt(lev0.Txt(binEnv))
 }
 
 // Устанавливает текущий путь относительно проекта в dev.

+ 0 - 97
v4/lev1/safe_bool/safe_bool.go

@@ -1,97 +0,0 @@
-// package safe_bool -- потокобезопасный булевый признак.
-package safe_bool
-
-import (
-	"os"
-	"strings"
-	"sync"
-
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-)
-
-// safeBool -- потокобезопасный булевый признак.
-type safeBool struct {
-	sync.RWMutex
-	val lev0.Bool
-}
-
-// NewSafeBool -- возвращает новый потокобезопасный булевый признак.
-func NewSafeBool(val lev0.Bool) lev0.ISafeBool {
-	sf := &safeBool{
-		val: val,
-	}
-	return sf
-}
-
-// NewSafeBoolFromStr -- возвращает новое потокобезопасное булево из строки.
-func NewSafeBoolFromStr(strVal *lev0.LTxt) *lev0.Result[lev0.ISafeBool] {
-	sf := NewSafeBool(false)
-	res := sf.FromStr(strVal)
-	if res.IsSome() {
-		err := lev0.LetErr("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w",
-			strVal, res.Some().Get())
-		return lev0.ResErr[lev0.ISafeBool](err)
-	}
-	return lev0.ResOk(sf)
-}
-
-// NewSafeBoolGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeBoolGetenv(env *lev0.LTxt) *lev0.Result[lev0.ISafeBool] {
-	sf := NewSafeBool(false)
-	res := sf.Getenv(env)
-	if res.IsSome() {
-		err := lev0.LetErr("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Some().Get())
-		return lev0.ResErr[lev0.ISafeBool](err)
-	}
-	return lev0.ResOk(sf)
-}
-
-// Get -- возвращает хранимый булевый признак.
-func (sf *safeBool) Get() lev0.Bool {
-	sf.RLock()
-	defer sf.RUnlock()
-	return sf.val
-}
-
-// Set -- устанавливает булевый признак.
-func (sf *safeBool) Set() {
-	sf.Lock()
-	defer sf.Unlock()
-	sf.val = true
-}
-
-// Reset -- сбрасывает булевый признак.
-func (sf *safeBool) Reset() {
-	sf.Lock()
-	defer sf.Unlock()
-	sf.val = false
-}
-
-// FromStr -- получает число из строки.
-func (sf *safeBool) FromStr(strVal *lev0.LTxt) *lev0.Option[*lev0.LErr] {
-	_strVal := strings.ToLower(strVal.String())
-	sf.Lock()
-	defer sf.Unlock()
-	switch _strVal {
-	case "true":
-		sf.val = true
-	case "false":
-		sf.val = false
-	default:
-		err := lev0.LetErr("safeBool.FromStr(): val(%v) bad", strVal)
-		return lev0.NewSome(err)
-	}
-	return lev0.NewNone[*lev0.LErr]()
-}
-
-// Getenv -- получает значение из окружения.
-func (sf *safeBool) Getenv(env *lev0.LTxt) *lev0.Option[*lev0.LErr] {
-	strVal := lev0.ATxt(os.Getenv(env.String()))
-	res := sf.FromStr(lev0.LetTxt(strVal))
-	if res.IsSome() {
-		err := lev0.LetErr("safeBool.Getenv(): from env %v, err=\n\t%w",
-			env, res.Some().Get())
-		return lev0.NewSome(err)
-	}
-	return lev0.NewNone[*lev0.LErr]()
-}

+ 0 - 129
v4/lev1/safe_bool_react/safe_bool_react.go

@@ -1,129 +0,0 @@
-// package safe_bool_react -- потокобезопасный булевый признак с реакцией на своё изменение.
-package safe_bool_react
-
-import (
-	"os"
-	"strings"
-	"sync"
-
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
-)
-
-// safeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение.
-type safeBoolReact struct {
-	sync.RWMutex
-	dict map[*lev0.LTxt]func(*lev0.MBool) // Словарь обратных вызовов
-	val  defs.Bool
-}
-
-// NewSafeBoolReact -- возвращает новый потокобезопасный булевый признак с реакцией на своё изменение.
-func NewSafeBoolReact() lev0.ISafeBoolReact {
-	sf := &safeBoolReact{
-		dict: map[*lev0.LTxt]func(*lev0.MBool){},
-	}
-	return sf
-}
-
-// NewSafeBoolReactFromStr -- возвращает новое потокобезопасное булево с реакцией из строки.
-func NewSafeBoolReactFromStr(strVal *lev0.LTxt) *lev0.Result[lev0.ISafeBoolReact] {
-	sf := NewSafeBoolReact()
-	res := sf.FromStr(strVal)
-	if res.IsSome() {
-		err := lev0.LetErr("NewSafeBoolReactFromStr(): in parse str(%v), err=\n\t%w",
-			strVal, res.Some().Get())
-		return lev0.ResErr[lev0.ISafeBoolReact](err)
-	}
-	return lev0.ResOk(sf)
-}
-
-// NewSafeBoolGetenv -- возвращает новое потокобезопасное целое с реакцией из окружения.
-func NewSafeBoolGetenv(env *lev0.LTxt) *lev0.Result[lev0.ISafeBoolReact] {
-	sf := NewSafeBoolReact()
-	res := sf.Getenv(env)
-	if res.IsSome() {
-		err := lev0.LetErr("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Some().Get())
-		return lev0.ResErr[lev0.ISafeBoolReact](err)
-	}
-	return lev0.ResOk(sf)
-}
-
-// Delete -- удаляет функцию обратного вызова из наблюдения.
-func (sf *safeBoolReact) Delete(key *lev0.LTxt) {
-	sf.Lock()
-	defer sf.Unlock()
-	delete(sf.dict, key)
-}
-
-// Add -- добавляет функцию обратного вызова.
-func (sf *safeBoolReact) Add(key *lev0.LTxt, fn func(*lev0.MBool)) *lev0.Result[bool] {
-	sf.Lock()
-	defer sf.Unlock()
-	if key.Get() == "" {
-		err := lev0.LetErr("safeBoolReact.Add(): key is empty")
-		return lev0.ResErr[bool](err)
-	}
-	_, isOk := sf.dict[key]
-	if isOk {
-		err := lev0.LetErr("safeBoolReact.Add(): key(%v) already exists", key)
-		return lev0.ResErr[bool](err)
-	}
-	sf.dict[key] = fn
-	return lev0.ResOk((true))
-}
-
-// Get -- возвращает хранимый булевый признак.
-func (sf *safeBoolReact) Get() lev0.Bool {
-	sf.RLock()
-	defer sf.RUnlock()
-	return sf.val
-}
-
-// Set -- устанавливает булевый признак.
-func (sf *safeBoolReact) Set() {
-	sf.Lock()
-	defer sf.Unlock()
-	sf.val = true
-	for _, fn := range sf.dict {
-		fn(lev0.MutBool(true))
-	}
-}
-
-// Reset -- сбрасывает булевый признак.
-func (sf *safeBoolReact) Reset() {
-	sf.Lock()
-	defer sf.Unlock()
-	sf.val = false
-	for _, fn := range sf.dict {
-		fn(lev0.MutBool(false))
-	}
-}
-
-// FromStr -- получает число из строки.
-func (sf *safeBoolReact) FromStr(strVal *lev0.LTxt) *lev0.Option[*lev0.LErr] {
-	_strVal := strings.ToLower(strVal.String())
-	sf.Lock()
-	defer sf.Unlock()
-	switch _strVal {
-	case "true":
-		sf.val = true
-	case "false":
-		sf.val = false
-	default:
-		err := lev0.LetErr("safeBoolReact.FromStr(): val(%v) bad", strVal)
-		return lev0.NewSome(err)
-	}
-	return lev0.NewNone[*lev0.LErr]()
-}
-
-// Getenv -- получает значение из окружения.
-func (sf *safeBoolReact) Getenv(env *lev0.LTxt) *lev0.Option[*lev0.LErr] {
-	strVal := lev0.ATxt(os.Getenv(env.String()))
-	res := sf.FromStr(lev0.LetTxt(strVal))
-	if res.IsSome() {
-		err := lev0.LetErr("safeBoolReact.Getenv(): from env %v, err=\n\t%w",
-			env, res.Some().Get())
-		return lev0.NewSome[*lev0.LErr](err)
-	}
-	return lev0.NewNone[*lev0.LErr]()
-}

+ 0 - 152
v4/lev1/safe_int/safe_int.go

@@ -1,152 +0,0 @@
-// package safe_int -- потокобезопасный целое.
-package safe_int
-
-import (
-	"sync"
-
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-)
-
-// // ISafeInt -- интерфейс к потокобезопасной переменной.
-// type ISafeInt interface {
-// 	Int
-// 	// Lock -- захватывает переменную
-// 	Lock()
-// 	// Unlock -- отпускает переменную
-// 	Unlock()
-// }
-
-// MSafeInt -- потокобезопасное целое.
-type MSafeInt struct {
-	sync.RWMutex
-	val *lev0.MInt
-}
-
-// MutSafeInt -- возвращает новое потокобезопасное целое.
-func MutSafeInt[T lev0.IntConstraint](val T) *MSafeInt {
-	sf := &MSafeInt{
-		val: lev0.MutInt(val),
-	}
-	return sf
-}
-
-// MutSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
-func MutSafeIntFromStr(txtVal *lev0.LTxt) *lev0.Result[*MSafeInt] {
-	res := lev0.Atoi(txtVal.Get())
-	if res.IsErr() {
-		err := lev0.LetErr("MutSafeIntFromStr(): in parse str(%v), err=\n\t%w", txtVal, res.Err())
-		return lev0.ResErr[*MSafeInt](err)
-	}
-	_val := MutSafeInt(res.Ok())
-	return lev0.ResOk(_val)
-}
-
-// MutSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
-func MutSafeIntGetenv(env *lev0.LTxt) *lev0.Result[*MSafeInt] {
-	sf := MutSafeInt(0)
-	res := sf.FromEnv(env)
-	if res.IsErr() {
-		err := lev0.LetErr("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
-		return lev0.ResErr[*MSafeInt](err)
-	}
-	return lev0.ResOk(sf)
-}
-
-// FromBool -- устанавливает значение из булева значения.
-func (sf *MSafeInt) FromBool(val lev0.Bool) lev0.Int {
-	sf.Lock()
-	defer sf.Unlock()
-	if val {
-		sf.val.Set(1)
-		return 1
-	}
-	sf.val.Set(0)
-	return 0
-}
-
-// Get -- возвращает хранимое целое.
-func (sf *MSafeInt) Get() lev0.Int {
-	sf.RLock()
-	defer sf.RUnlock()
-	return sf.val.Get()
-}
-
-// Dec -- уменьшает значение на 1.
-func (sf *MSafeInt) Dec() {
-	sf.Lock()
-	defer sf.Unlock()
-	sf.val.Dec()
-}
-
-// Inc -- увеличивает значение на 1.
-func (sf *MSafeInt) Inc() {
-	sf.Lock()
-	defer sf.Unlock()
-	sf.val.Inc()
-}
-
-// Set -- устанавливает целое.
-func (sf *MSafeInt) Set(val lev0.Int) {
-	sf.Lock()
-	defer sf.Unlock()
-	sf.val.Set(val)
-}
-
-// Reset -- сбрасывает целое.
-func (sf *MSafeInt) Reset() {
-	sf.Lock()
-	defer sf.Unlock()
-	sf.val.Reset()
-}
-
-// FromStr -- получает число из строки.
-func (sf *MSafeInt) FromStr(txtVal *lev0.LTxt) *lev0.Result[lev0.Int] {
-	sf.Lock()
-	defer sf.Unlock()
-	res := sf.val.FromTxt(txtVal)
-	if res.IsErr() {
-		err := lev0.LetErr("MSafeInt.FromStr(): form str(%v) to int, err=\n\t%v", txtVal, res.Error())
-		return lev0.ResErr[lev0.Int](err)
-	}
-	return lev0.ResOk(sf.val.Get())
-}
-
-// FromByte -- получает число из среза байт.
-func (sf *MSafeInt) FromByte(binData []byte) *lev0.Result[lev0.Int] {
-	sf.Lock()
-	defer sf.Unlock()
-	res := sf.val.FromByte(binData)
-	if res.IsErr() {
-		err := lev0.LetErr("MSafeInt.FromByte(): form binData(%v) to int", binData, res.Error())
-		return lev0.ResErr[lev0.Int](err)
-	}
-	return lev0.ResOk(sf.val.Get())
-}
-
-// ToByte -- конвертирует число в срез байт.
-func (sf *MSafeInt) ToByte() []byte {
-	sf.RLock()
-	defer sf.RUnlock()
-	return sf.val.ToByte()
-}
-
-// ToBool -- конвертирует число в bool.
-func (sf *MSafeInt) ToBool() lev0.Bool {
-	sf.RLock()
-	defer sf.RUnlock()
-	return sf.val.ToBool()
-}
-
-// Txt -- конвертирует число в строку.
-func (sf *MSafeInt) Txt() *lev0.LTxt {
-	sf.RLock()
-	defer sf.RUnlock()
-	return sf.val.Txt()
-}
-
-// FromEnv -- получает значение из окружения.
-func (sf *MSafeInt) FromEnv(env *lev0.LTxt) *lev0.Result[*lev0.LInt] {
-	sf.Lock()
-	defer sf.Unlock()
-	return sf.val.FromEnv(env)
-}

+ 9 - 10
v4/lev2/kchan/kchan.go

@@ -7,12 +7,11 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 )
 
 // KChanParam -- параметры умного канала.
 type KChanParam[T any] struct {
-	Limit_   lev0.Int            // лимит на размер канала, не может быть пустым
+	Limit_   lev0.Num            // лимит на размер канала, не может быть пустым
 	OnWrite_ func(T)             // Обратный вызов при записи в канал
 	OnRead_  func(T)             // Обратный вызов при чтении из канала
 	OnClose_ func()              // Обратный вызов при закрытии канала
@@ -20,7 +19,7 @@ type KChanParam[T any] struct {
 	Ctx_     comp_spec.ILocalCtx // Локальный контекст для контроля создателя
 }
 
-var msg1 = lev0.ATxt("KChanParam[T]: ctx==nil")
+var msg1 = lev0.Txt("KChanParam[T]: ctx==nil")
 
 // SelfCheck -- проверка корректности правильности параметров умного канала.
 func (sf *KChanParam[T]) SelfCheck() {
@@ -43,11 +42,11 @@ func (sf *KChanParam[T]) SelfCheck() {
 type KChan[T any] struct {
 	*KChanParam[T]
 	block    sync.RWMutex
-	isClosed lev0.ISafeBool
+	isClosed *lev0.MSafeBool
 	lstMsg   []T
 }
 
-var msg2 = lev0.ATxt("NewKChan: param==nil")
+var msg2 = lev0.Txt("NewKChan: param==nil")
 
 // NewKChan -- создаёт новый безопасный умный канал.
 func NewKChan[T any](param *KChanParam[T]) lev0.IChan[T] {
@@ -55,7 +54,7 @@ func NewKChan[T any](param *KChanParam[T]) lev0.IChan[T] {
 	param.SelfCheck()
 	sf := &KChan[T]{
 		KChanParam: param,
-		isClosed:   safe_bool.NewSafeBool(true),
+		isClosed:   lev0.MutSafeBool(true),
 	}
 	go sf.close()
 	return sf
@@ -76,17 +75,17 @@ func (sf *KChan[T]) Read() *lev0.Result[T] {
 }
 
 // Limit -- ограничение размера канала.
-func (sf *KChan[T]) Limit() defs.Int {
+func (sf *KChan[T]) Limit() defs.Num {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
-	return defs.Int(len(sf.lstMsg))
+	return defs.Num(len(sf.lstMsg))
 }
 
 // Len -- возвращает количество элементов в канале.
-func (sf *KChan[T]) Len() defs.Int {
+func (sf *KChan[T]) Len() defs.Num {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
-	return defs.Int(len(sf.lstMsg))
+	return defs.Num(len(sf.lstMsg))
 }
 
 // IsClosed -- возвращает признак закрытия канала.

+ 1 - 1
v4/lev2/kctx/kctx_test.go

@@ -38,7 +38,7 @@ func (sf *tester) new() {
 	}
 	res := kCtx.Get(counter)
 	ctxVal := res.Hassert("new()")
-	val := ctxVal.Val().(lev0.Int)
+	val := ctxVal.Val().(lev0.Num)
 	if val != 5 {
 		sf.t.Fatalf("new(): counter(%v)!=5", val)
 	}

+ 1 - 1
v4/lev2/kern_ent/stream_name/stream_name.go

@@ -10,7 +10,7 @@ type AStreamName struct {
 }
 
 // NewAStreamName -- создать новое имя потока.
-func NewAStreamName(val lev0.ATxt) *AStreamName {
+func NewAStreamName(val lev0.Txt) *AStreamName {
 	lev0.If(val == "").Hassert("NewAStreamName(): val is empty")
 	sf := &AStreamName{
 		LTxt: lev0.LetTxt(val),

+ 1 - 2
v4/lev2/kernel_keeper/kernel_keeper.go

@@ -11,7 +11,6 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kern_ent/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 )
@@ -45,7 +44,7 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(),
 	lev0.If(fnCancel == nil).Hassert("NewKernelCtx(): fnCancel==nil", []any{})
 
 	paramLogBuf := &mL1.LogBufParam{
-		IsTerm_: safe_bool.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 		Prefix_: lev0.LetTxt("kernelKeeper"),
 	}
 

+ 6 - 6
v4/lev2/kmodule/kmodule.go

@@ -24,7 +24,7 @@ type kModule struct {
 	ctx       comp_spec.ILocalCtx
 	name      *module_name.LModuleName
 	bus       bus_spec.IKernelBus
-	timePhase *lev1.MSafeInt
+	timePhase *lev0.MSafeNum
 	txtLive   *lev0.MTxt
 	stat      mod_spec.IModuleStat
 }
@@ -38,7 +38,7 @@ func NewKernelModule(name *module_name.LModuleName) mod_spec.IKernelModule {
 		ctx:       lev1.NewLocalCtx(kCtx.Ctx()),
 		name:      name,
 		bus:       kbus_local.GetKernelBusLocal(),
-		timePhase: lev1.MutSafeInt(1000), // 1000 msec
+		timePhase: lev0.MutSafeNum(1000), // 1000 msec
 		txtLive:   lev0.MutTxt(""),
 		stat:      mod_stat.NewModStat(name),
 	}
@@ -87,10 +87,10 @@ func (sf *kModule) Live() *lev0.LTxt {
 }
 
 var (
-	f0 = lev0.ATxt("|")
-	f1 = lev0.ATxt("/")
-	f2 = lev0.ATxt("-")
-	f3 = lev0.ATxt("\\")
+	f0 = lev0.Txt("|")
+	f1 = lev0.Txt("/")
+	f2 = lev0.Txt("-")
+	f3 = lev0.Txt("\\")
 )
 
 // Сигнал жизни, каждые 5 сек публикует в шину метку.

+ 3 - 4
v4/lev2/kmodule/mod_stat/mod_stat.go

@@ -12,7 +12,6 @@ import (
 	"time"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat/mod_stat_day"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat/mod_stat_sec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
@@ -21,7 +20,7 @@ import (
 // ModStat -- статистика модуля.
 type ModStat struct {
 	statSec    *mod_stat_sec.ModStatSec // Объект статистики 60 секунд
-	timeMinute *lev1.MSafeInt             // Интервал ожидания минутного таймера, мсек
+	timeMinute *lev0.MSafeNum             // Интервал ожидания минутного таймера, мсек
 	statMin    *mod_stat_day.ModStatDay // Объект статистики 60 минут
 	statDay    *mod_stat_day.ModStatDay // Объект статистики за последние 24 часа
 	name       *module_name.LModuleName
@@ -34,7 +33,7 @@ func NewModStat(name *module_name.LModuleName) *ModStat {
 		statSec:    mod_stat_sec.NewModStatSec(),
 		statMin:    mod_stat_day.NewModStatDay(),
 		statDay:    mod_stat_day.NewModStatDay(),
-		timeMinute: lev1.MutSafeInt(60 * 1000),
+		timeMinute: lev0.MutSafeNum(60 * 1000),
 		name:       name,
 	}
 	go sf.eventMinute()
@@ -58,7 +57,7 @@ func (sf *ModStat) eventMinute() {
 }
 
 // Add -- добавляет значение в статистику.
-func (sf *ModStat) Add(val lev0.Int) {
+func (sf *ModStat) Add(val lev0.Num) {
 	sf.statSec.Add(val)
 }
 

+ 9 - 9
v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day.go

@@ -16,24 +16,24 @@ import (
 // ModStatDay -- статистика модуля за первые 24 часа.
 type ModStatDay struct {
 	sync.RWMutex
-	lst    []lev0.Int // Список значений за первые 24 часа
+	lst    []lev0.Num // Список значений за первые 24 часа
 	bufSvg *bytes.Buffer
 }
 
 // NewModStatDay -- возвращает новую статистику модуля за первые 24 часа.
 func NewModStatDay() *ModStatDay {
 	sf := &ModStatDay{
-		lst:    []lev0.Int{},
+		lst:    []lev0.Num{},
 		bufSvg: bytes.NewBufferString(""),
 	}
 	return sf
 }
 
 // Sum -- возвращает сумму элементов по требованию.
-func (sf *ModStatDay) Sum() lev0.Int {
+func (sf *ModStatDay) Sum() lev0.Num {
 	sf.RLock()
 	defer sf.RUnlock()
-	sum := lev0.Int(0)
+	sum := lev0.Num(0)
 	for _, val := range sf.lst {
 		sum += val
 	}
@@ -41,7 +41,7 @@ func (sf *ModStatDay) Sum() lev0.Int {
 }
 
 // Add -- добавляет значение в часовой срез.
-func (sf *ModStatDay) Add(val lev0.Int) {
+func (sf *ModStatDay) Add(val lev0.Num) {
 	sf.Lock()
 	defer sf.Unlock()
 
@@ -77,7 +77,7 @@ func (sf *ModStatDay) Svg() *lev0.LTxt {
 	return lev0.LetTxt(strOut)
 }
 
-func (sf *ModStatDay) drawNet(valMin, valMax lev0.Int, cnv *svg.SVG) {
+func (sf *ModStatDay) drawNet(valMin, valMax lev0.Num, cnv *svg.SVG) {
 	// Метки величины
 	if valMin == math.MaxInt64 || valMin == math.MinInt64 {
 		valMin = 0
@@ -127,10 +127,10 @@ func (sf *ModStatDay) drawNet(valMin, valMax lev0.Int, cnv *svg.SVG) {
 }
 
 // Вычисляет максимальное и минимальное значение в графике.
-func (sf *ModStatDay) getMinNax() (lev0.Int, lev0.Int) {
+func (sf *ModStatDay) getMinNax() (lev0.Num, lev0.Num) {
 	var (
-		valMin = lev0.Int(math.MaxInt64)
-		valMax = lev0.Int(math.MinInt64)
+		valMin = lev0.Num(math.MaxInt64)
+		valMax = lev0.Num(math.MinInt64)
 	)
 	for _, val := range sf.lst {
 		if val < valMin {

+ 8 - 8
v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go

@@ -16,24 +16,24 @@ import (
 // ModStatMinutes -- статистика модуля за первые 60 мин.
 type ModStatMinutes struct {
 	sync.RWMutex
-	lst    []lev0.Int // Список значений за последние 60 мин
+	lst    []lev0.Num // Список значений за последние 60 мин
 	bufSvg *bytes.Buffer
 }
 
 // NewModStatMinute -- возвращает новую статистику модуля за последние 60 мин.
 func NewModStatMinute() *ModStatMinutes {
 	sf := &ModStatMinutes{
-		lst:    []lev0.Int{},
+		lst:    []lev0.Num{},
 		bufSvg: bytes.NewBufferString(""),
 	}
 	return sf
 }
 
 // Sum -- возвращает сумму элементов по требованию.
-func (sf *ModStatMinutes) Sum() lev0.Int {
+func (sf *ModStatMinutes) Sum() lev0.Num {
 	sf.RLock()
 	defer sf.RUnlock()
-	sum := lev0.Int(0)
+	sum := lev0.Num(0)
 	for _, val := range sf.lst {
 		sum += val
 	}
@@ -41,7 +41,7 @@ func (sf *ModStatMinutes) Sum() lev0.Int {
 }
 
 // Add -- добавляет значение в часовой срез.
-func (sf *ModStatMinutes) Add(val lev0.Int) {
+func (sf *ModStatMinutes) Add(val lev0.Num) {
 	sf.Lock()
 	defer sf.Unlock()
 
@@ -66,8 +66,8 @@ func (sf *ModStatMinutes) Svg() *lev0.LTxt {
 	cnv.Desc("Graphic of last 60 minute")
 	cnv.Text(20, 20, "Last 60 minute", "")
 	var (
-		valMin = lev0.Int(math.MaxInt64)
-		valMax = lev0.Int(math.MinInt64)
+		valMin = lev0.Num(math.MaxInt64)
+		valMax = lev0.Num(math.MinInt64)
 	)
 	fnGetMinMax := func() { // Вычисляет максимальное и минимальное значение в графике
 		for _, val := range sf.lst {
@@ -91,7 +91,7 @@ func (sf *ModStatMinutes) Svg() *lev0.LTxt {
 	return lev0.LetTxt(strOut)
 }
 
-func (sf *ModStatMinutes) drawNet(valMin, valMax lev0.Int, cnv *svg.SVG) {
+func (sf *ModStatMinutes) drawNet(valMin, valMax lev0.Num, cnv *svg.SVG) {
 	// Метки величины
 	if valMin == math.MaxInt64 || valMin == math.MinInt64 {
 		valMin = 0

+ 8 - 8
v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go

@@ -16,7 +16,7 @@ import (
 // ModStatSec -- статистика модуля за первые 60 сек.
 type ModStatSec struct {
 	sync.RWMutex
-	lst      []lev0.Int // Список значений за последние 60 сек
+	lst      []lev0.Num // Список значений за последние 60 сек
 	momentAt int64      // Метка времени для учёта текущей секунды
 	bufSvg   *bytes.Buffer
 }
@@ -24,7 +24,7 @@ type ModStatSec struct {
 // NewModStatSec -- возвращает новую статистику модуля за последние 60 сек.
 func NewModStatSec() *ModStatSec {
 	sf := &ModStatSec{
-		lst:      []lev0.Int{},
+		lst:      []lev0.Num{},
 		bufSvg:   bytes.NewBufferString(""),
 		momentAt: time.Now().Local().Unix(),
 	}
@@ -32,10 +32,10 @@ func NewModStatSec() *ModStatSec {
 }
 
 // Sum -- возвращает сумму элементов по требованию.
-func (sf *ModStatSec) Sum() lev0.Int {
+func (sf *ModStatSec) Sum() lev0.Num {
 	sf.RLock()
 	defer sf.RUnlock()
-	sum := lev0.Int(0)
+	sum := lev0.Num(0)
 	for _, val := range sf.lst {
 		sum += val
 	}
@@ -43,7 +43,7 @@ func (sf *ModStatSec) Sum() lev0.Int {
 }
 
 // Add -- добавляет значение в минутный срез.
-func (sf *ModStatSec) Add(val lev0.Int) {
+func (sf *ModStatSec) Add(val lev0.Num) {
 	sf.Lock()
 	defer sf.Unlock()
 
@@ -85,8 +85,8 @@ func (sf *ModStatSec) Svg() *lev0.LTxt {
 	cnv.Text(20, 20, "Last 60 sec", "")
 	// cnv.Circle(250, 250, 125, "fill:none;stroke:black")
 	var (
-		valMin = lev0.Int(math.MaxInt64)
-		valMax = lev0.Int(math.MinInt64)
+		valMin = lev0.Num(math.MaxInt64)
+		valMax = lev0.Num(math.MinInt64)
 	)
 	fnGetMinMax := func() { // Вычисляет максимальное и минимальное значение в графике
 		for _, val := range sf.lst {
@@ -111,7 +111,7 @@ func (sf *ModStatSec) Svg() *lev0.LTxt {
 	return lev0.LetTxt(strOut)
 }
 
-func (sf *ModStatSec) drawNet(valMin, valMax lev0.Int, cnv *svg.SVG) {
+func (sf *ModStatSec) drawNet(valMin, valMax lev0.Num, cnv *svg.SVG) {
 	// Метки величины
 	if valMin == math.MaxInt64 {
 		valMin = 0

+ 4 - 4
v4/lev2/kmonolit/kmonolit.go

@@ -20,8 +20,8 @@ type LModMonolit struct {
 	log     comp_spec.ILogBuf
 	name    mod_ent.AModuleName
 	isLocal *lev0.LBool
-	isWork  lev0.ISafeBool
-	isEnd   lev0.ISafeBool
+	isWork  *lev0.MSafeBool
+	isEnd   *lev0.MSafeBool
 	dict    map[mod_ent.AModuleName]mod_spec.IKernelModule // Словарь модулей монолита
 }
 
@@ -53,8 +53,8 @@ func LetModMonolit(name mod_ent.AModuleName) *LModMonolit {
 		lCtx:    lCtx,
 		name:    name,
 		dict:    map[mod_ent.AModuleName]mod_spec.IKernelModule{},
-		isWork:  mL1.NewSafeBool(false),
-		isEnd:   mL1.NewSafeBool(false),
+		isWork:  lev0.MutSafeBool(false),
+		isEnd:   lev0.MutSafeBool(false),
 		isLocal: lev0.LetBool(isLocal),
 	}
 	sf.log = sf.lCtx.Log()

+ 6 - 6
v4/lev2/kserv_http/kserv_http.go

@@ -26,7 +26,7 @@ import (
 )
 
 var (
-	msg0       = lev0.ATxt("kernel_server_http")
+	msg0       = lev0.Txt("kernel_server_http")
 	streamName = stream_name.NewAStreamName(msg0) // Контрольная строка для ожидателя потока
 )
 
@@ -37,8 +37,8 @@ type kServHttp struct {
 	log      comp_spec.ILogBuf
 	strUrl   *lev0.LTxt // URL, на котором слушает HTTP-сервер
 	fiberApp *fiber.App
-	isWork   lev0.ISafeBool
-	isEnd    lev0.ISafeBool
+	isWork   *lev0.MSafeBool
+	isEnd    *lev0.MSafeBool
 }
 
 //go:embed static/*
@@ -51,7 +51,7 @@ var (
 
 func getParams() (*lev0.LTxt, comp_spec.ILogBuf, kspec.IKernelCtx) {
 	param := &log_buf.LogBufParam{
-		IsTerm_: mL1.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 		Prefix_: lev0.LetTxt("kServHttp"),
 	}
 	log := mL1.NewLogBuf(param)
@@ -88,8 +88,8 @@ func GetKernelServHttp() kspec.IKernelServerHttp {
 		lCtx:     mL1.NewLocalCtx(kCtx.Ctx()),
 		strUrl:   strLocalUrl,
 		fiberApp: fiber.New(confFiber),
-		isWork:   mL1.NewSafeBool(false),
-		isEnd:    mL1.NewSafeBool(false),
+		isWork:   lev0.MutSafeBool(false),
+		isEnd:    lev0.MutSafeBool(false),
 	}
 	sf.fiberApp.Use(compress.New(compress.Config{
 		Level: compress.LevelBestCompression, // 2

+ 6 - 7
v4/lev2/kserv_http_std/kserv_http_std.go

@@ -8,10 +8,9 @@ import (
 	"time"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 )
@@ -20,7 +19,7 @@ import (
 type kServHttpStd struct {
 	kCtx   kspec.IKernelCtx
 	log    comp_spec.ILogBuf
-	port   *lev0.LInt
+	port   *lev0.LNum
 	server *http.Server
 }
 
@@ -37,17 +36,17 @@ func GetKservHttpStd() *lev0.Result[*kServHttpStd] {
 		return lev0.ResOk(kServ)
 	}
 	logBufParam := &log_buf.LogBufParam{
-		IsTerm_: safe_bool.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 		Prefix_: lev0.LetTxt("kServHttpStd"),
 	}
-	log := mL1.NewLogBuf(logBufParam)
+	log := lev1.NewLogBuf(logBufParam)
 	log.Debug("GetKservHttpStd()")
-	resPort := mL1.MutSafeIntGetenv(lev0.LetTxt("SERV_HTTP_STD_PORT"))
+	resPort := lev0.MutSafeNumFromEnv(lev0.LetTxt("SERV_HTTP_STD_PORT"))
 	port := resPort.Hassert("in get env SERV_HTTP_STD_PORT")
 	sf := &kServHttpStd{
 		kCtx: kctx.GetKernelCtx(),
 		log:  log,
-		port: lev0.LetInt(port.Get()),
+		port: lev0.LetNum(port.Get()),
 	}
 	kServ = sf
 	return lev0.ResOk(sf)

+ 1 - 1
v4/lev2/kspec/ikernel_wg.go

@@ -21,7 +21,7 @@ type IKernelWg interface {
 	// List -- возвращает список имён потоков на ожидании
 	List() []*stream_name.AStreamName
 	// Len -- возвращает размер списка потоков ожидания
-	Len() lev0.Int
+	Len() lev0.Num
 	// Log -- возвращает логгер ожидателя групп
 	Log() comp_spec.ILogBuf
 }

+ 5 - 6
v4/lev2/kwg/kwg.go

@@ -12,7 +12,6 @@ import (
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kern_ent/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 )
@@ -22,7 +21,7 @@ type kernelWg struct {
 	sync.RWMutex
 	ctx        context.Context
 	dictStream map[*stream_name.AStreamName]lev0.Bool // Словарь имён потоков с признаком работы
-	isWork     lev0.ISafeBool
+	isWork     *lev0.MSafeBool
 	log        comp_spec.ILogBuf
 }
 
@@ -41,13 +40,13 @@ func GetKernelWg(ctx context.Context) kspec.IKernelWg {
 	}
 	lev0.If(ctx == nil).Hassert("GetKernelWg(): ctx==nil")
 	paramLogBuf := &log_buf.LogBufParam{
-		IsTerm_: safe_bool.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 		Prefix_: lev0.LetTxt("kernelWg"),
 	}
 	sf := &kernelWg{
 		ctx:        ctx,
 		dictStream: map[*stream_name.AStreamName]lev0.Bool{},
-		isWork:     mL1.NewSafeBool(false),
+		isWork:     lev0.MutSafeBool(false),
 		log:        mL1.NewLogBuf(paramLogBuf),
 	}
 	sf.log.Debug("GetKernelWg(): run")
@@ -63,10 +62,10 @@ func (sf *kernelWg) Log() comp_spec.ILogBuf {
 }
 
 // Len -- возвращает размер списка ожидания потоков.
-func (sf *kernelWg) Len() lev0.Int {
+func (sf *kernelWg) Len() lev0.Num {
 	sf.RLock()
 	defer sf.RUnlock()
-	return lev0.Int(len(sf.dictStream))
+	return lev0.Num(len(sf.dictStream))
 }
 
 // IsWork -- возвращает признак работы ядра.

+ 6 - 7
v4/lev2/lsi/kstore_kv/kstore_kv.go

@@ -12,7 +12,6 @@ import (
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kern_ent/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
@@ -34,7 +33,7 @@ type kStoreKv struct {
 	wg        kspec.IKernelWg
 	storePath *lev0.LTxt
 	db        *badger.DB
-	isWork    lev0.ISafeBool
+	isWork    *lev0.MSafeBool
 }
 
 var (
@@ -53,14 +52,14 @@ func GetKernelStore() store_spec.IKernelStoreKv {
 	kCtx := kctx.GetKernelCtx()
 	param := &log_buf.LogBufParam{
 		Prefix_: lev0.LetTxt("kStoreKv"),
-		IsTerm_: safe_bool.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 	}
 	log := mL1.NewLogBuf(param)
 	sf := &kStoreKv{
 		kCtx:   kCtx,
 		lCtx:   mL1.NewLocalCtx(kCtx.Ctx()),
 		wg:     kCtx.Wg(),
-		isWork: mL1.NewSafeBool(true),
+		isWork: lev0.MutSafeBool(true),
 		log:    log,
 	}
 	sf.open()
@@ -189,7 +188,7 @@ func (sf *kStoreKv) open() {
 
 // Выполняет периодическую сборку мусора в файле.
 func (sf *kStoreKv) clean() {
-	chRun := make(chan lev0.Int, 2)
+	chRun := make(chan lev0.Num, 2)
 	defer close(chRun)
 	fnClean := func() {
 		sf.Lock()
@@ -209,7 +208,7 @@ func (sf *kStoreKv) clean() {
 }
 
 // Ожидает последнего потока под отдельной блокировкой.
-func (sf *kStoreKv) wait(chWait chan lev0.Int) {
+func (sf *kStoreKv) wait(chWait chan lev0.Num) {
 	for {
 		time.Sleep(time.Millisecond * 5)
 		if sf.wg.Len() <= 1 {
@@ -227,7 +226,7 @@ func (sf *kStoreKv) close() {
 	if !sf.isWork.Get() {
 		return
 	}
-	chWait := make(chan lev0.Int, 2)
+	chWait := make(chan lev0.Num, 2)
 	go sf.wait(chWait)
 	<-chWait
 	sf.isWork.Reset()

+ 1 - 1
v4/lev2/lsi/kstore_kv/kstore_kv_test.go

@@ -106,7 +106,7 @@ func (sf *tester) get() {
 	key := rec_key.NewRecKey("test_key")
 	res := kernStore.Get(key)
 	res.Hassert("get(): val==nil")
-	strVal := lev0.ATxt(res.Ok())
+	strVal := lev0.Txt(res.Ok())
 	if strVal != "test_val" {
 		sf.t.Fatalf("get(): strVal(%v)!='test_val'", strVal)
 	}

+ 4 - 4
v4/lev2/lsi/kstore_kv_std/kv_bucket_base/kv_bucket_base.go

@@ -20,18 +20,18 @@ import (
 // Как только бакет заполнится, он будет вытеснен на диск.
 type KvBucketBase struct {
 	Name_      *lev0.LTxt                         `json:"name"`       // Имя бакета
-	Level_     lev0.Int                             `json:"level"`      // Уровень бакета
-	Number_    lev0.Int                             `json:"num"`        // Номер бакета
+	Level_     lev0.Num                             `json:"level"`      // Уровень бакета
+	Number_    lev0.Num                             `json:"num"`        // Номер бакета
 	Size_      int64                                `json:"size"`       // Размер бакета
 	SizeLimit_ int64                                `json:"size_limit"` // Лимит размера бакета
 	CreatedAt_ *lev0.LTime                      `json:"created_at"` // Время создания бакета
 	UpdatedAt_ *lev0.MTime                   `json:"updated_at"` // Время обновления бакета
-	Vers_      lev0.Int                             `json:"vers"`       // Версия бакета
+	Vers_      lev0.Num                             `json:"vers"`       // Версия бакета
 	dictRec    map[rec_key.ARecKey]rec_kv.IRecKvFix // Словарь для хранения данных
 }
 
 // NewKvBucketBase -- создание нового базового бакета хранилища KV.
-func NewKvBucketBase(name *lev0.LTxt, level, number lev0.Int) *KvBucketBase {
+func NewKvBucketBase(name *lev0.LTxt, level, number lev0.Num) *KvBucketBase {
 	lev0.If(name.Get() == "").Hassert("NewKvBucketBase: name is empty", []any{})
 	lev0.If(level < 0).Hassert("NewKvBucketBase: level is negative", []any{})
 	lev0.If(number < 0).Hassert("NewKvBucketBase: number is negative", []any{})

+ 3 - 3
v4/lev2/lsi/store_ent/dict_rec/dict_rec.go

@@ -18,7 +18,7 @@ type IDictRec interface {
 	// Del -- удаляет значение по ключу
 	Del(key rec_key.IRecKeyFix)
 	// Len -- возвращает количество записей
-	Len() lev0.Int
+	Len() lev0.Num
 }
 
 // DictRec -- потокобезопасный словарь KV-бакета.
@@ -67,8 +67,8 @@ func (sf *DictRec) Del(key rec_key.IRecKeyFix) {
 }
 
 // Len -- количество элементов в словаре.
-func (sf *DictRec) Len() lev0.Int {
+func (sf *DictRec) Len() lev0.Num {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
-	return lev0.Int(len(sf.dict))
+	return lev0.Num(len(sf.dict))
 }

+ 1 - 1
v4/lev2/lsi/store_ent/rec_key/store_key.go

@@ -6,7 +6,7 @@ import (
 )
 
 // ARecKey -- ключ хранилища.
-type ARecKey lev0.ATxt
+type ARecKey lev0.Txt
 
 type IString interface{
 	String()string

+ 3 - 3
v4/lev2/lsi/store_spec/ibucket_base.go

@@ -10,9 +10,9 @@ type IBucketBase interface {
 	// Name -- имя бакета
 	Name() lev0.BucketName
 	// Level -- уровень бакета
-	Level() lev0.Int
+	Level() lev0.Num
 	// Number -- номер бакета
-	Number() lev0.Int
+	Number() lev0.Num
 	// Size -- размер бакета
 	Size() int64
 	// SizeLimit -- лимит размера бакета
@@ -22,7 +22,7 @@ type IBucketBase interface {
 	// UpdatedAt -- время обновления бакета
 	UpdatedAt() *lev0.LTxt
 	// Vers -- версия бакета
-	Vers() *lev0.Int
+	Vers() *lev0.Num
 	// DictRec -- словарь для хранения данных
 	DictRec() store_ent.IDictRec
 }

+ 1 - 1
v4/lev2/lti/bus_ent/handler_name/handler_name.go

@@ -6,7 +6,7 @@ import (
 )
 
 // AHandlerName -- имя функции обработчика.
-type AHandlerName lev0.ATxt
+type AHandlerName lev0.Txt
 
 // LHandlerName -- имя функции обработчика.
 type LHandlerName struct {

+ 3 - 3
v4/lev2/lti/bus_ent/topic/topic_let.go

@@ -5,7 +5,7 @@ import (
 )
 
 // ATopic -- имя топика в шине.
-type ATopic lev0.ATxt
+type ATopic lev0.Txt
 
 // LTopic -- имя топика в шине.
 type LTopic struct {
@@ -22,8 +22,8 @@ func LetTopic(val ATopic)*LTopic{
 }
 
 // Txt -- возвращает объект внутреннего текста
-func (sf *LTopic) Txt() lev0.ATxt {
-	return lev0.ATxt(sf.val)
+func (sf *LTopic) Txt() lev0.Txt {
+	return lev0.Txt(sf.val)
 }
 
 // String -- строковое представление топика.

+ 2 - 3
v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go

@@ -5,7 +5,6 @@ import (
 	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
@@ -13,7 +12,7 @@ import (
 
 // MockHandlerServe -- мок-обработчик входящих запросов.
 type MockHandlerServe struct {
-	IsBad_ lev0.ISafeBool           // Признак сбоя при вызове
+	IsBad_ *lev0.MSafeBool            // Признак сбоя при вызове
 	Msg_   []byte                  // Для обратного вызова
 	Name_  *bus_ent.LHandlerName // Уникальное имя мок-обработчика подписки
 	Topic_ *topic.LTopic       // Имя топика подписки
@@ -27,7 +26,7 @@ func NewMockHandlerServe(topic *topic.LTopic, name bus_ent.AHandlerName) *MockHa
 	sf := &MockHandlerServe{
 		Topic_: topic,
 		Name_:  bus_ent.NewHandlerNameFix(name),
-		IsBad_: safe_bool.NewSafeBool(false),
+		IsBad_: lev0.MutSafeBool(false),
 	}
 	_ = bus_spec.IBusHandlerServe(sf)
 	return sf

+ 2 - 2
v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go

@@ -60,7 +60,7 @@ func (sf *MockHandSubHttp) Name() *bus_ent.LHandlerName {
 func (sf *MockHandSubHttp) FnBack(binMsg []byte) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	log.Printf("HandlerHttpSub.FnBack(): msg=%v\n", lev0.ATxt(binMsg))
+	log.Printf("HandlerHttpSub.FnBack(): msg=%v\n", lev0.Txt(binMsg))
 	sf.BinMsg_ = binMsg
 }
 
@@ -68,5 +68,5 @@ func (sf *MockHandSubHttp) FnBack(binMsg []byte) {
 func (sf *MockHandSubHttp) Msg() *lev0.LTxt {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	return lev0.LetTxt(lev0.ATxt(sf.BinMsg_))
+	return lev0.LetTxt(lev0.Txt(sf.BinMsg_))
 }

+ 1 - 1
v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go

@@ -35,7 +35,7 @@ func NewMockHandlerSub(topic *topic.LTopic, localHook *lev0.LTxt) *MockHandlerSu
 func (sf *MockHandlerSub) Msg() *lev0.LTxt {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
-	return lev0.LetTxt(lev0.ATxt(sf.Msg_))
+	return lev0.LetTxt(lev0.Txt(sf.Msg_))
 }
 
 // Функция обратного вызова подписки.

+ 1 - 1
v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub_test.go

@@ -31,7 +31,7 @@ func (sf *tester) backGood1() {
 	sf.t.Log("backGood1")
 	sf.hand.FnBack([]byte("test_msg"))
 	if sf.hand.Msg().Get() != "test_msg" {
-		sf.t.Fatalf("backGood1(): binMsg(%v)!='test_msg'", lev0.ATxt(sf.hand.Msg_))
+		sf.t.Fatalf("backGood1(): binMsg(%v)!='test_msg'", lev0.Txt(sf.hand.Msg_))
 	}
 }
 

+ 2 - 2
v4/lev2/lti/kbus_base/kbus_base.go

@@ -23,7 +23,7 @@ var (
 // KBusBase -- базовая часть шины данных.
 type KBusBase struct {
 	KCtx_     kspec.IKernelCtx
-	IsWork_   lev0.ISafeBool
+	IsWork_   *lev0.MSafeBool
 	lCtx      comp_spec.ILocalCtx
 	log       comp_spec.ILogBuf
 	dictSub   bus_spec.IDictTopicSub
@@ -46,7 +46,7 @@ func GetKernelBusBase() *KBusBase {
 	lCtx := mL1.NewLocalCtx(kCtx.Ctx())
 	Bus_ = &KBusBase{
 		KCtx_:     kCtx,
-		IsWork_:   mL1.NewSafeBool(false),
+		IsWork_:   lev0.MutSafeBool(false),
 		dictSub:   dict_topic_sub.NewDictTopicSub(),
 		dictServe: dict_topic_serve.NewDictServe(),
 		lCtx:      lCtx,

+ 7 - 9
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go

@@ -10,11 +10,9 @@ import (
 	"github.com/google/uuid"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
-	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_txt"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
@@ -27,7 +25,7 @@ type ClientBusHttp struct {
 	bus       bus_spec.IKernelBus
 	lCtx      comp_spec.ILocalCtx
 	log       comp_spec.ILogBuf
-	isWork    lev0.ISafeBool
+	isWork    *lev0.MSafeBool
 	urlRemote *lev0.LTxt // URL дистанционной шины
 	urlLocal  *lev0.LTxt // URL локальной шины для веб-хуков
 }
@@ -35,24 +33,24 @@ type ClientBusHttp struct {
 // NewClientBusHttp - -возвращает новый клиент HTTP-шины.
 func NewClientBusHttp(urlRemote *lev0.LTxt) bus_spec.IBusClient {
 	param := &log_buf.LogBufParam{
-		IsTerm_: safe_bool.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 		Prefix_: lev0.LetTxt("ClientBusHttp"),
 	}
-	log := mL1.NewLogBuf(param)
+	log := lev1.NewLogBuf(param)
 	log.Debug("NewClientBusHttp()")
 	lev0.If(urlRemote == nil).Hassert("NewClientBusHttp(): urlRemote is empty", []any{})
 	kCtx := kctx.GetKernelCtx()
-	resLocal := safe_txt.MutSafeTxtFromEnv(
+	resLocal := lev0.MutSafeTxtFromEnv(
 		lev0.LetTxt("LOCAL_HTTP_URL"))
 	resLocal.Hassert("NewClientBusHttp(): in get env LOCAL_HTTP_URL)")
 	urlLocal := resLocal.Ok()
 	txtUrl := urlLocal.TrimSuffix("/")
 	kBusHttp := kbus_http.GetKernelBusHttp()
 	sf := &ClientBusHttp{
-		lCtx:      mL1.NewLocalCtx(kCtx.Ctx()),
+		lCtx:      lev1.NewLocalCtx(kCtx.Ctx()),
 		log:       log,
 		bus:       kBusHttp,
-		isWork:    mL1.NewSafeBool(true),
+		isWork:    lev0.MutSafeBool(true),
 		urlRemote: lev0.LetTxt(urlRemote.TrimSuffix("/")),
 		urlLocal:  lev0.LetTxt(txtUrl),
 	}

+ 1 - 1
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http_test.go

@@ -89,7 +89,7 @@ func (sf *tester) sendGood1() {
 	if res.Ok() == nil {
 		sf.t.Fatalf("sendGood1(): binResp==nil")
 	}
-	strResp := lev0.ATxt(res.Ok())
+	strResp := lev0.Txt(res.Ok())
 	if strResp != "test msg 456" {
 		sf.t.Fatalf("sendGood1(): strResp(%v)!='test msg 456'", strResp)
 	}

+ 1 - 2
v4/lev2/lti/kbus_http/kbus_http.go

@@ -10,7 +10,6 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
@@ -39,7 +38,7 @@ func GetKernelBusHttp() bus_spec.IKernelBus {
 		return Bus_
 	}
 	paramLogBuf := &mL1.LogBufParam{
-		IsTerm_: safe_bool.NewSafeBool(true),
+		IsTerm_: lev0.MutSafeBool(true),
 		Prefix_: lev0.LetTxt("kBusHttp"),
 	}
 	log := mL1.NewLogBuf(paramLogBuf)

+ 1 - 1
v4/lev2/lti/kbus_http/kbus_http_test.go

@@ -516,7 +516,7 @@ func (sf *tester) reqGood1() {
 	if err != nil {
 		sf.t.Fatalf("reqGood1(): err=%v", err)
 	}
-	if lev0.ATxt(resp.BinResp_) != "test_msg" {
+	if lev0.Txt(resp.BinResp_) != "test_msg" {
 		sf.t.Fatalf("reqGood1(): resp(%v)!='test_msg'", resp.BinResp_)
 	}
 }

+ 3 - 3
v4/lev2/wui/hx_swap_oob/hx_swap_oob.go

@@ -10,7 +10,7 @@ import (
 // HxSwapOob -- объект внеполосной подкачки.
 type HxSwapOob struct {
 	sync.RWMutex
-	val lev0.ATxt
+	val lev0.Txt
 }
 
 // NewHxSwapOob -- возвращает новую внеполосную подкачку.
@@ -27,14 +27,14 @@ func (sf *HxSwapOob) String() string {
 }
 
 // Get -- возвращает хранимое значение внеполосной подкачки.
-func (sf *HxSwapOob) Get() lev0.ATxt {
+func (sf *HxSwapOob) Get() lev0.Txt {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.val
 }
 
 // Set -- устанавливает значение внеполосной подкачки.
-func (sf *HxSwapOob) Set(val lev0.ATxt) {
+func (sf *HxSwapOob) Set(val lev0.Txt) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.val = val

+ 3 - 3
v4/lev2/wui/hx_target/hx_target.go

@@ -11,7 +11,7 @@ import (
 // HxSwap -- атрибут HTMX (цель замены).
 type HxSwap struct {
 	sync.RWMutex
-	val defs.ATxt
+	val defs.Txt
 }
 
 // NewHxTarget -- возвращает новую цель замены.
@@ -31,7 +31,7 @@ func (sf *HxSwap) String() string {
 }
 
 // Get -- возвращает хранимое значение цели замена.
-func (sf *HxSwap) Get() defs.ATxt {
+func (sf *HxSwap) Get() defs.Txt {
 	sf.RLock()
 	defer sf.RUnlock()
 
@@ -39,7 +39,7 @@ func (sf *HxSwap) Get() defs.ATxt {
 }
 
 // Set -- устанавливает значение цели обмена.
-func (sf *HxSwap) Set(val defs.ATxt) {
+func (sf *HxSwap) Set(val defs.Txt) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.val = val

+ 8 - 8
v4/lev2/wui/hx_vals/hx_vals.go

@@ -13,27 +13,27 @@ import (
 // HxVals -- атрибут HTMX (словарь значений).
 type HxVals struct {
 	sync.RWMutex
-	dict map[defs.ATxt]any
+	dict map[defs.Txt]any
 }
 
 // NewHxVals -- возвращает новый словарь значений.
 func NewHxVals() *HxVals {
 	sf := &HxVals{
-		dict: map[defs.ATxt]any{},
+		dict: map[defs.Txt]any{},
 	}
 	_ = mWt.IHxVals(sf)
 	return sf
 }
 
 // Len -- возвращает размер словаря.
-func (sf *HxVals) Len() defs.Int {
+func (sf *HxVals) Len() defs.Num {
 	sf.RLock()
 	defer sf.RUnlock()
-	return defs.Int(len(sf.dict))
+	return defs.Num(len(sf.dict))
 }
 
 // Del -- удаляет ключ словаря.
-func (sf *HxVals) Del(key defs.ATxt) {
+func (sf *HxVals) Del(key defs.Txt) {
 	sf.Lock()
 	defer sf.Unlock()
 	delete(sf.dict, key)
@@ -43,7 +43,7 @@ func (sf *HxVals) Del(key defs.ATxt) {
 func (sf *HxVals) Clear() {
 	sf.Lock()
 	defer sf.Unlock()
-	sf.dict = map[defs.ATxt]any{}
+	sf.dict = map[defs.Txt]any{}
 }
 
 // String -- возвращает строковое представление тэга.
@@ -55,14 +55,14 @@ func (sf *HxVals) String() string {
 }
 
 // Get -- возвращает хранимое значение словарь значений.
-func (sf *HxVals) Get(key defs.ATxt) any {
+func (sf *HxVals) Get(key defs.Txt) any {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.dict[key]
 }
 
 // Set -- устанавливает значение словарь значений.
-func (sf *HxVals) Set(key defs.ATxt, val any) {
+func (sf *HxVals) Set(key defs.Txt, val any) {
 	sf.Lock()
 	defer sf.Unlock()
 	mKh.If(key == "").Hassert("HxVals.Set(): key is empty")

+ 1 - 1
v4/lev2/wui/wui.go

@@ -9,7 +9,7 @@ import (
 )
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
-func NewWuiButton(text *lev0.LTxt, fnClick func(map[lev0.ATxt]lev0.ATxt) *lev0.Result[*lev0.LTxt]) mWt.IWuiButton {
+func NewWuiButton(text *lev0.LTxt, fnClick func(map[lev0.Txt]lev0.Txt) *lev0.Result[*lev0.LTxt]) mWt.IWuiButton {
 	wBtn := wui_button.NewWuiButton(text, fnClick)
 	return wBtn
 }

+ 2 - 2
v4/lev2/wui/wui_button/wui_button.go

@@ -13,7 +13,7 @@ import (
 )
 
 // FnBtnBack -- функция обратного вызова для кнопки.
-type FnBtnBack func(map[lev0.ATxt]lev0.ATxt) *lev0.Result[*lev0.LTxt]
+type FnBtnBack func(map[lev0.Txt]lev0.Txt) *lev0.Result[*lev0.LTxt]
 
 // WuiButton -- WUI-кнопка.
 type WuiButton struct {
@@ -49,7 +49,7 @@ func (sf *WuiButton) Text() mWt.IWuiText {
 }
 
 // Click -- событие нажатия.
-func (sf *WuiButton) Click(dict map[lev0.ATxt]lev0.ATxt) *lev0.Result[*lev0.LTxt] {
+func (sf *WuiButton) Click(dict map[lev0.Txt]lev0.Txt) *lev0.Result[*lev0.LTxt] {
 	return sf.fnBack(dict)
 }
 

+ 4 - 4
v4/lev2/wui/wui_button/wui_button_test.go

@@ -8,13 +8,13 @@ import (
 
 type tester struct {
 	t      *testing.T
-	chCall chan lev0.ATxt
+	chCall chan lev0.Txt
 }
 
 func TestWuiButton(t *testing.T) {
 	sf := &tester{
 		t:      t,
-		chCall: make(chan lev0.ATxt, 2),
+		chCall: make(chan lev0.Txt, 2),
 	}
 	sf.new()
 }
@@ -35,14 +35,14 @@ func (sf *tester) new() {
 	if hx := btn.Hx(); hx == nil {
 		sf.t.Fatalf("new(): IWuiHx==nil")
 	}
-	btn.Click(map[lev0.ATxt]lev0.ATxt{}).Hassert("new()")
+	btn.Click(map[lev0.Txt]lev0.Txt{}).Hassert("new()")
 	if str := <-sf.chCall; str != "test" {
 		sf.t.Fatalf("new(): bad called")
 	}
 }
 
 // Функция обратного вызова.
-func (sf *tester) fnBack(dict map[lev0.ATxt]lev0.ATxt) *lev0.Result[*lev0.LTxt] {
+func (sf *tester) fnBack(dict map[lev0.Txt]lev0.Txt) *lev0.Result[*lev0.LTxt] {
 	sf.chCall <- "test"
 	return lev0.ResOk(lev0.LetTxt("test_click"))
 }

+ 1 - 1
v4/lev2/wui/wui_test.go

@@ -31,7 +31,7 @@ func (sf *tester) get() {
 }
 
 // Функция обратного вызова.
-func (sf *tester) fnClick(dict map[lev0.ATxt]lev0.ATxt) *lev0.Result[*lev0.LTxt] {
+func (sf *tester) fnClick(dict map[lev0.Txt]lev0.Txt) *lev0.Result[*lev0.LTxt] {
 	sf.t.Log("fnClick")
 	return lev0.ResOk(lev0.LetTxt("test_click"))
 }

+ 1 - 1
v4/lev2/wui/wui_types/ihx_swap_oob.go

@@ -25,5 +25,5 @@ import (
 // hx-swap-oob="true".
 type IHxSwapOob interface {
 	// Set -- устанавливает атрибут HTMX
-	Set(lev0.ATxt)
+	Set(lev0.Txt)
 }

+ 2 - 2
v4/lev2/wui/wui_types/ihx_target.go

@@ -41,7 +41,7 @@ import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 // <a hx-post="/new-link" hx-target="this" hx-swap="outerHTML">New link</a>.
 type IHxTarget interface {
 	// Set -- устанавливает цель атрибута
-	Set(defs.ATxt)
+	Set(defs.Txt)
 	// Get -- возвращает цель атрибута
-	Get() defs.ATxt
+	Get() defs.Txt
 }

+ 4 - 4
v4/lev2/wui/wui_types/ihx_vals.go

@@ -18,13 +18,13 @@ import "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 // hx-vals='js:{x: event.clientX, y: event.clientY}'.
 type IHxVals interface {
 	// Get --  возвращает элемент словаря
-	Get(key lev0.ATxt) any
+	Get(key lev0.Txt) any
 	// Set -- устанавливает элемент словаря
-	Set(key lev0.ATxt, val any)
+	Set(key lev0.Txt, val any)
 	// Del -- удаляет элемент из словаря
-	Del(key lev0.ATxt)
+	Del(key lev0.Txt)
 	// Clear -- очищает весь словарь
 	Clear()
 	// Len -- возвращает размер словаря
-	Len() lev0.Int
+	Len() lev0.Num
 }

+ 1 - 1
v4/lev2/wui/wui_types/iwui_button.go

@@ -10,7 +10,7 @@ type IWuiButton interface {
 	// Text -- возвращает текст кнопки
 	Text() IWuiText
 	// Click -- нажатие кнопки
-	Click(map[lev0.ATxt]lev0.ATxt) *lev0.Result[*lev0.LTxt]
+	Click(map[lev0.Txt]lev0.Txt) *lev0.Result[*lev0.LTxt]
 	// Hx -- атрибуты HTMX
 	Hx() IWuiHx
 }

+ 2 - 2
v4/lev3/mod_ent/mod_num/mod_num.go

@@ -9,7 +9,7 @@ import (
 )
 
 // AModNum -- номер модуля.
-type AModNum lev0.Int
+type AModNum lev0.Num
 
 // LModuleNum -- номер модуля.
 type LModuleNum struct {
@@ -51,7 +51,7 @@ func (sf *LModuleNum) Num() AModNum {
 }
 
 // Get -- внутренняя строка модуля.
-func (sf *LModuleNum) Get() lev0.ATxt {
+func (sf *LModuleNum) Get() lev0.Txt {
 	return lev0.LetTxt("%v", sf.num).Get()
 }
 

+ 5 - 5
v4/lev3/mod_ent/module_name/module_name.go

@@ -6,7 +6,7 @@ import (
 )
 
 // AModuleName -- уникальное имя модуля.
-type AModuleName lev0.ATxt
+type AModuleName lev0.Txt
 
 // Имя модуля
 type moduleName struct {
@@ -46,8 +46,8 @@ func (sf moduleName) String() string {
 }
 
 // Txt -- возвращает строковое представление
-func (sf moduleName) Txt() lev0.ATxt {
-	return lev0.ATxt(sf.name)
+func (sf moduleName) Txt() lev0.Txt {
+	return lev0.Txt(sf.name)
 }
 
 // Get -- возвращает имя модуля.
@@ -66,6 +66,6 @@ func (sf moduleName) Rune() []rune {
 }
 
 // Len -- длина строки.
-func (sf moduleName) Len() lev0.Int {
-	return lev0.Int(len(sf.name))
+func (sf moduleName) Len() lev0.Num {
+	return lev0.Num(len(sf.name))
 }

+ 2 - 2
v4/lev3/mod_serv_http/btn_modules/btn_modules.go

@@ -11,7 +11,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
-		"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_spec"
 )
 
 type BtnModules struct {
@@ -41,7 +41,7 @@ var strBlockModules string
 var strBlockRow string
 
 // Событие клика по кнопке.
-func (sf *BtnModules) clickMonolit(dict map[lev0.ATxt]lev0.ATxt) *lev0.Result[*lev0.LTxt] {
+func (sf *BtnModules) clickMonolit(dict map[lev0.Txt]lev0.Txt) *lev0.Result[*lev0.LTxt] {
 	optMonolit := sf.kCtx.Get(lev0.LetTxt("monolit"))
 	if optMonolit.IsNone() {
 		err := lev0.LetErr("clickMonolit(): monolit module not found")

+ 1 - 1
v4/lev3/mod_serv_http/btn_modules/btn_modules_test.go

@@ -21,7 +21,7 @@ func TestBtnModules(t *testing.T) {
 	modName := module_name.LetModuleName("test")
 	mod := kmodule.NewKernelModule(modName)
 	kMon.Add(mod)
-	if str := btn.clickMonolit(map[lev0.ATxt]lev0.ATxt{}).
+	if str := btn.clickMonolit(map[lev0.Txt]lev0.Txt{}).
 		Hassert("TestBtnModules()"); str.Get() == "" {
 		t.Fatalf("strOut is empty")
 	}

+ 1 - 1
v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go

@@ -30,7 +30,7 @@ func (sf *BtnMonolit) Html() *lev0.LTxt {
 var strBlockMonolit string
 
 // Событие клика по кнопке.
-func (sf *BtnMonolit) clickMonolit(dict map[lev0.ATxt]lev0.ATxt) *lev0.Result[*lev0.LTxt] {
+func (sf *BtnMonolit) clickMonolit(dict map[lev0.Txt]lev0.Txt) *lev0.Result[*lev0.LTxt] {
 	txtBlockMonolit := lev0.LetTxt(strBlockMonolit)
 	return lev0.ResOk(txtBlockMonolit)
 }

+ 1 - 1
v4/lev3/mod_serv_http/btn_monolit/btn_monolit_test.go

@@ -21,7 +21,7 @@ func TestBtnModules(t *testing.T) {
 	modName := module_name.LetModuleName("test")
 	mod := kmodule.NewKernelModule(modName)
 	kMon.Add(mod)
-	if str := btn.clickMonolit(map[lev0.ATxt]lev0.ATxt{}).
+	if str := btn.clickMonolit(map[lev0.Txt]lev0.Txt{}).
 		Hassert("TestBtnModules()"); str.Get() == "" {
 		t.Fatalf("strOut is empty")
 	}

+ 1 - 1
v4/lev3/mod_serv_http/page_module/page_module.go

@@ -78,7 +78,7 @@ func (sf *PageModule) postModuleLog(ctx fiber.Ctx) error {
 	}
 
 	strOut := ""
-	for i := range lev0.Int(100) {
+	for i := range lev0.Num(100) {
 		msg := _log.Get(i).String()
 		if strings.Contains(msg, "*no msg*") {
 			continue

+ 1 - 1
v4/lev3/mod_serv_http/page_module/page_module_test.go

@@ -253,7 +253,7 @@ func (sf *tester) postModuleState() {
 	}
 }
 
-var testMsg = lev0.ATxt("test msg")
+var testMsg = lev0.Txt("test msg")
 
 // Возвращает состояние модуля 1 (теперь добавлен).
 func (sf *tester) postModule1() {

+ 1 - 1
v4/lev3/mod_serv_http/page_monolit/page_monolit.go

@@ -71,7 +71,7 @@ func (sf *PageMonolit) postMonolitLog(ctx fiber.Ctx) error {
 	mon := optMonolit.Some().Val().(mod_spec.IKernelMonolit)
 	_log := mon.Log()
 	strOut := ""
-	for i := range lev0.Int(100) {
+	for i := range lev0.Num(100) {
 		msg := _log.Get(i).String()
 		if strings.Contains(msg, "*no msg*") {
 			continue

+ 1 - 1
v4/lev3/mod_spec/imod_stat.go

@@ -11,5 +11,5 @@ type IModuleStat interface {
 	// SvgDay -- возвращает SVG с поминутным графиком за последние сутки
 	SvgDay() *lev0.LTxt
 	// Add -- добавляет секундное показание в статистику
-	Add(lev0.Int)
+	Add(lev0.Num)
 }

+ 3 - 3
v4/lev3/mod_wui/mod_wui.go

@@ -102,12 +102,12 @@ func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) {
 		_, _ = fmt.Fprint(resp, strOut)
 		return
 	}
-	dict := map[lev0.ATxt]lev0.ATxt{}
+	dict := map[lev0.Txt]lev0.Txt{}
 
 	// headers := ctx.GetReqHeaders()
 	for key, lstVal := range req.Header {
 		if len(lstVal) >= 1 {
-			dict[lev0.ATxt(key)] = lev0.ATxt(lstVal[0])
+			dict[lev0.Txt(key)] = lev0.Txt(lstVal[0])
 			continue
 		}
 	}
@@ -120,7 +120,7 @@ func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) {
 	// values := req.ParseForm()
 	for key, lstVal := range req.Form {
 		if len(lstVal) >= 1 {
-			dict[lev0.ATxt(key)] = lev0.ATxt(lstVal[0])
+			dict[lev0.Txt(key)] = lev0.Txt(lstVal[0])
 			continue
 		}
 	}

+ 1 - 1
v4/lev3/mod_wui/mod_wui_test.go

@@ -151,7 +151,7 @@ func (sf *tester) clickGood1() {
 }
 
 // Обратный вызов клика.
-func (sf *tester) fnClick(dict map[lev0.ATxt]lev0.ATxt) *lev0.Result[*lev0.LTxt] {
+func (sf *tester) fnClick(dict map[lev0.Txt]lev0.Txt) *lev0.Result[*lev0.LTxt] {
 	sf.t.Log("fnClick")
 	return lev0.ResOk(lev0.LetTxt("test_click"))
 }