Kaynağa Gözat

SVI Рабочее сохранение

SVI 1 ay önce
ebeveyn
işleme
a5f0f2d652
76 değiştirilmiş dosya ile 913 ekleme ve 441 silme
  1. 1 1
      v4/Taskfile.yml
  2. 1 1
      v4/go.mod
  3. 11 8
      v4/kern.go
  4. 6 6
      v4/kern_test.go
  5. 3 3
      v4/lev0/core_spec/ebool.go
  6. 4 2
      v4/lev0/core_spec/eint.go
  7. 2 1
      v4/lev0/core_spec/ichan.go
  8. 6 4
      v4/lev0/core_spec/ikernel_int.go
  9. 18 0
      v4/lev0/core_spec/imutex.go
  10. 0 0
      v4/lev0/core_spec/imutex_rw.go
  11. 2 2
      v4/lev0/core_spec/iresult.go
  12. 5 2
      v4/lev0/core_spec/isafe_bool.go
  13. 1 1
      v4/lev0/core_spec/isafe_bool_react.go
  14. 1 1
      v4/lev0/core_spec/isafe_string.go
  15. 16 0
      v4/lev0/defs/def_bool/def_bool.go
  16. 0 13
      v4/lev0/defs/def_int/def_int.go
  17. 17 0
      v4/lev0/defs/def_let/def_let.go
  18. 41 0
      v4/lev0/defs/def_let_err/def_let_err.go
  19. 65 0
      v4/lev0/defs/def_let_txt/def_let_txt.go
  20. 56 0
      v4/lev0/defs/def_move/def_box.go
  21. 22 0
      v4/lev0/defs/def_mut/def_mut.go
  22. 71 0
      v4/lev0/defs/def_mut_txt/def_mut_txt.go
  23. 47 0
      v4/lev0/defs/def_num/def_num.go
  24. 0 4
      v4/lev0/defs/def_spec/def_bool.go
  25. 14 0
      v4/lev0/defs/def_spec/def_box.go
  26. 22 0
      v4/lev0/defs/def_spec/def_num.go
  27. 0 23
      v4/lev0/defs/def_spec/def_result.go
  28. 29 14
      v4/lev0/defs/def_spec/def_spec.go
  29. 5 3
      v4/lev0/defs/def_spec/def_tuf.go
  30. 2 2
      v4/lev0/defs/def_spec/def_txt.go
  31. 11 0
      v4/lev0/defs/def_spec_base/def_spec_base.go
  32. 54 0
      v4/lev0/defs/def_spec_fn/def_spec_fn.go
  33. 5 5
      v4/lev0/defs/def_txt/def_txt.go
  34. 3 5
      v4/lev0/defs/defs.go
  35. 31 40
      v4/lev0/helpers/helpers.go
  36. 10 13
      v4/lev0/lev0.go
  37. 6 15
      v4/lev0/option/option.go
  38. 35 40
      v4/lev0/result/result.go
  39. 18 17
      v4/lev0/result/result_test.go
  40. 1 1
      v4/lev0/tuf/tuf.go
  41. 3 2
      v4/lev1/comp_spec/ilog_buf.go
  42. 11 11
      v4/lev1/kint/kint.go
  43. 3 3
      v4/lev1/lev1.go
  44. 4 4
      v4/lev1/log_dict_topic/log_dict_topic.go
  45. 57 0
      v4/lev1/mutex/mutex.go
  46. 13 13
      v4/lev1/safe_bool/safe_bool.go
  47. 16 16
      v4/lev1/safe_bool_react/safe_bool_react.go
  48. 10 10
      v4/lev1/safe_int/safe_int.go
  49. 7 7
      v4/lev1/safe_string/safe_string.go
  50. 4 4
      v4/lev2/kchan/kchan.go
  51. 2 2
      v4/lev2/kmodule/kmodule.go
  52. 4 4
      v4/lev2/kserv_http_std/kserv_http_std.go
  53. 6 6
      v4/lev2/log_topic/log_topic.go
  54. 13 13
      v4/lev2/lsi/kstore_kv/kstore_kv.go
  55. 9 9
      v4/lev2/lsi/store_ent/dict_rec/dict_rec.go
  56. 5 4
      v4/lev2/lsi/store_spec/ikernel_store_kv.go
  57. 4 4
      v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go
  58. 2 2
      v4/lev2/lti/bus_spec/ibus_handler_serve.go
  59. 3 2
      v4/lev2/lti/bus_spec/idict_topic.go
  60. 5 5
      v4/lev2/lti/bus_spec/ikernel_bus.go
  61. 9 9
      v4/lev2/lti/kbus/dict_topic_serve/dict_topic_serve.go
  62. 13 14
      v4/lev2/lti/kbus_base/kbus_base.go
  63. 27 28
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go
  64. 2 2
      v4/lev2/wui/wui.go
  65. 6 6
      v4/lev2/wui/wui_button/wui_button.go
  66. 3 3
      v4/lev2/wui/wui_button/wui_button_test.go
  67. 3 3
      v4/lev2/wui/wui_label/wui_label.go
  68. 3 3
      v4/lev2/wui/wui_test.go
  69. 2 2
      v4/lev2/wui/wui_types/iwui_button.go
  70. 2 2
      v4/lev3/mod_ent/mod_ent.go
  71. 1 2
      v4/lev3/mod_ent/mod_num/mod_num.go
  72. 4 4
      v4/lev3/mod_serv_http/btn_modules/btn_modules.go
  73. 3 3
      v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go
  74. 4 4
      v4/lev3/mod_serv_http/http_api/http_api.go
  75. 5 5
      v4/lev3/mod_serv_http/page_module/page_module.go
  76. 3 3
      v4/lev3/mod_wui/mod_wui_test.go

+ 1 - 1
v4/Taskfile.yml

@@ -24,7 +24,7 @@ tasks:
     desc: "Обновление зависимостей"
     cmds:
       - clear
-      - go mod tidy -compat=1.26.4
+      - go mod tidy -compat=1.27.0
       - go mod vendor
       - go fmt ./...
   test:

+ 1 - 1
v4/go.mod

@@ -1,6 +1,6 @@
 module gitp78su.ipnodns.ru/svi/kern/v4
 
-go 1.26.4
+go 1.27.0
 
 require (
 	github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b

+ 11 - 8
v4/kern.go

@@ -8,7 +8,7 @@ import (
 	mL0 "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/lev0/helpers"
+	// "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"
@@ -40,18 +40,21 @@ func GetKernelCtx() kspec.IKernelCtx {
 	return ctx
 }
 
+// Result — обёртка вокруг результата с возможной ошибкой.
+type Result[T any] = mL0.Result[T]
+
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err defs.IErr) mL0.IResult[T] {
+func NewErr[T any](err defs.IErr) *Result[T] {
 	return mL0.NewErr[T](err)
 }
 
 // NewOk -- возвращает успешный Result с значением.
-func NewOk[T any](res T) mL0.IResult[T] {
+func NewOk[T any](res T) *Result[T] {
 	return mL0.NewOk(res)
 }
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res mL0.IResult[T], err defs.IErr) mL0.IResult[T] {
+func WrapErr[T any](res *Result[T], err defs.IErr) *Result[T] {
 	return mL0.WrapErr(res, err)
 }
 
@@ -259,9 +262,9 @@ func NewNone[T any]() mL0.IOption[T] {
 }
 
 // FnIf -- проверяет с жёстким падением условие.
-type FnIf = helpers.FnIf
+// type FnIf = helpers.FnIf
 
 // If -- возвращает ссылку на функцию If (Hasssert/Assert).
-func If() FnIf {
-	return helpers.If
-}
+// func If() FnIf {
+// 	return helpers.If
+// }

+ 6 - 6
v4/kern_test.go

@@ -4,10 +4,10 @@ import (
 	"os"
 	"testing"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	// mL0 "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/lev0/helpers"
+	// "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"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"
@@ -78,10 +78,10 @@ func (sf *tester) new3() {
 		sf.t.Fatalf("new(): ISafeStr==nil")
 	}
 
-	fnIf := mL0.FnIf(helpers.If)
-	if fnIf == nil {
-		sf.t.Fatalf("new(): If==nil")
-	}
+	// fnIf := mL0.FnIf(helpers.If)
+	// if fnIf == nil {
+	// 	sf.t.Fatalf("new(): If==nil")
+	// }
 }
 
 func (sf *tester) new2() {

+ 3 - 3
v4/lev0/core_spec/ebool.go

@@ -1,13 +1,13 @@
 package core_spec
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
 
 // EBool -- расширенный бул.
 type EBool interface {
 	// IsOk -- проверяет на true.
-	IsOk() def_spec.Bool
+	IsOk() def_spec_base.Bool
 	// IsNot -- проверяет на false.
-	IsNot() def_spec.Bool
+	IsNot() def_spec_base.Bool
 }
 
 // EBoolMut -- мутабельный расширенный бул.

+ 4 - 2
v4/lev0/core_spec/eint.go

@@ -1,11 +1,13 @@
 package core_spec
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+)
 
 // EInt -- расширенное целочисленное значение.
 type EInt interface {
 	// SelfCheck -- выполняет самопроверку значения.
-	SelfCheck() def_spec.IResult[error]
+	SelfCheck() *def_spec.Result[error]
 	// Get -- возвращает целочисленное значение.
 	Get() def_spec.Int
 }

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

@@ -2,12 +2,13 @@ package core_spec
 
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // IChan -- умный канал.
 type IChan[T any] interface {
 	// Read -- читает сообщение из канала.
-	Read() def_spec.IResult[T]
+	Read() *result.Result[T]
 	// Limit -- лимит канала.
 	Limit() def_spec.Int
 	// Len -- количество сообщений в канале.

+ 6 - 4
v4/lev0/core_spec/ikernel_int.go

@@ -1,6 +1,8 @@
 package core_spec
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+)
 
 // Int -- целочисленный тип ядра.
 type Int interface {
@@ -15,11 +17,11 @@ type Int interface {
 	// Dec -- уменьшает число на 1
 	Dec()
 	// FromStr -- устанавливает значение из строки
-	FromStr(def_spec.ITxtFix) def_spec.IResult[def_spec.Int]
+	FromStr(def_spec.ITxtFix) *def_spec.Result[def_spec.Int]
 	// ToStr -- возвращает как строку
 	ToStr() def_spec.ITxtFix
 	// FromByte -- устанавливает значение из байтов
-	FromByte([]byte) def_spec.IResult[def_spec.Int]
+	FromByte([]byte) *def_spec.Result[def_spec.Int]
 	// ToByte -- возвращает как срез байт
 	ToByte() []byte
 	// FromBool -- устанавливает значение из булева
@@ -27,5 +29,5 @@ type Int interface {
 	// ToBool -- возвращает как булево значение
 	ToBool() def_spec.Bool
 	// Getenv -- устанавливает значение из окружения
-	Getenv(def_spec.ITxtFix) def_spec.IResult[def_spec.Int]
+	Getenv(def_spec.ITxtFix) *def_spec.Result[def_spec.Int]
 }

+ 18 - 0
v4/lev0/core_spec/imutex.go

@@ -0,0 +1,18 @@
+package core_spec
+
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+
+// IMutex -- безопасный мьютекс
+//
+// 1) проверка на захват
+// 2) не паникует при освобождении свободного (сообщает)
+type IMutex interface {
+	// Lock -- попытка захвата
+	Lock()
+	// Unlock -- освобождение
+	Unlock()
+	// IsFree -- проверка на свободу
+	IsFree() def_spec_base.Bool
+	// IsLock -- проверка на захват
+	IsLock() def_spec_base.Bool
+}

+ 0 - 0
v4/lev0/core_spec/irw_mutex.go → v4/lev0/core_spec/imutex_rw.go


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

@@ -4,5 +4,5 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
 )
 
-// IResult -- возвращаемый результат.
-type IResult[T any] = def_spec.IResult[T]
+// Result -- возвращаемый результат.
+type Result[T any] = def_spec.Result[T]

+ 5 - 2
v4/lev0/core_spec/isafe_bool.go

@@ -1,11 +1,14 @@
 package core_spec
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+)
 
 // ISafeBool -- интерфейс к потокобезопасной переменной.
 type ISafeBool interface {
 	// Get -- возвращает хранимое значение потокобезопасной переменной
-	Get() def_spec.Bool
+	Get() def_spec_base.Bool
 	// Set -- взводит хранимое потокобезопасное значение
 	Set()
 	// Reset -- сбрасывает хранимое потокобезопасное значение

+ 1 - 1
v4/lev0/core_spec/isafe_bool_react.go

@@ -8,7 +8,7 @@ import (
 type ISafeBoolReact interface {
 	ISafeBool
 	// Add -- добавляет функцию обратного вызова
-	Add(key def_spec.ITxtFix, fn func(EBoolMut)) IResult[bool]
+	Add(key def_spec.ITxtFix, fn func(EBoolMut)) *Result[bool]
 	// Delete -- удаляет функцию обратного вызова по ключу
 	Delete(key def_spec.ITxtFix)
 }

+ 1 - 1
v4/lev0/core_spec/isafe_string.go

@@ -15,5 +15,5 @@ type ISafeString interface {
 	// Byte -- возвращает байтовое представление строки
 	Byte() []byte
 	// Getenv -- устанавливает строку из переменной окружения
-	Getenv(def_spec.ITxtFix) IResult[def_spec.ITxtFix]
+	Getenv(def_spec.ITxtFix) *Result[def_spec.ITxtFix]
 }

+ 16 - 0
v4/lev0/defs/def_bool/def_bool.go

@@ -1 +1,17 @@
 package def_bool
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_let"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_mut"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+)
+
+// LetBool -- возвращает новый неизменяемый Bool
+func LetBool(val def_spec.Bool) *def_let.Let[def_spec.Bool] {
+	return def_let.NewLet(val)
+}
+
+// MutBool -- возвращает новый изменяемый Bool
+func MutBool(val def_spec.Bool) *def_mut.Mut[def_spec.Bool] {
+	return def_mut.NewMut(val)
+}

+ 0 - 13
v4/lev0/defs/def_int/def_int.go

@@ -1,13 +0,0 @@
-// package def_int -- базовый тип числа
-package def_int
-
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
-
-type Int struct {
-	val def_spec.Int
-}
-
-// Get -- возвращает целое число по требованию.
-func (sf *Int) Get() int {
-	return int(sf.val)
-}

+ 17 - 0
v4/lev0/defs/def_let/def_let.go

@@ -0,0 +1,17 @@
+// package def_let -- иммутабельный контейнер
+package def_let
+
+// Let -- иммутабельный контейнер
+type Let[T any] struct {
+	val T
+}
+
+// NewLet -- возвращает новый параметрический иммуьабельный контейнер
+func NewLet[T any](val T) *Let[T] {
+	return &Let[T]{val: val}
+}
+
+// Get -- возвращает хранимое значение
+func (l *Let[T]) Get() T {
+	return l.val
+}

+ 41 - 0
v4/lev0/defs/def_let_err/def_let_err.go

@@ -0,0 +1,41 @@
+// package def_let_err -- фиксировананя ошибка
+package def_let_err
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_let_txt"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+)
+
+// LetErr -- обёрнутая ошибка.
+type LetErr struct {
+	*def_let_txt.LetTxt
+}
+
+// Err -- создать новую обёрнутую ошибку.
+func Err(msg def_spec.ATxt, arg ...any) *LetErr {
+	helpers.If(msg == "").Hassert("Err(): msg is empty")
+	sf := &LetErr{
+		LetTxt: def_let_txt.NewLetTxt(msg, arg...),
+	}
+	return sf
+}
+
+// WrapErr -- возвращает обёрнутую ошибку.
+func (sf *LetErr)WrapErr(err error, arg ...any) *LetErr {
+	_sf := &LetErr{
+		LetTxt: def_let_txt.NewLetTxt(err.Error(), arg...),
+	}
+	return _sf
+}
+
+// IsErr -- возвращает true, если ошибка.
+func (sf *LetErr) IsErr() def_spec_base.Bool {
+	return sf.Get() != ""
+}
+
+// Error -- возвращает хранимую ошибку.
+func (sf *LetErr) Error() string {
+	return sf.String()
+}

+ 65 - 0
v4/lev0/defs/def_let_txt/def_let_txt.go

@@ -0,0 +1,65 @@
+// package def_let_txt -- неизменяемый текст
+package def_let_txt
+
+import (
+	"fmt"
+	"strconv"
+	"strings"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_let"
+	"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/result"
+)
+
+// LetTxt -- алиас для внутренней строки.
+type LetTxt struct {
+	*def_let.Let[def_spec_base.ATxt]
+}
+
+// NewLetTxt -- создать новую неизменяемую строку.
+func NewLetTxt[T def_spec_fn.TxtConstraint](msg T, arg ...any) *LetTxt {
+	_msg := def_spec_fn.Sprintf(msg, arg...)
+	sf := &LetTxt{
+		Let: def_let.NewLet(_msg),
+	}
+	return sf
+}
+
+// TrimSuffix -- обрезает суффикс строки.
+func (sf *LetTxt) TrimSuffix(suffix any) def_spec_base.ATxt {
+	suf := fmt.Sprintf("%v", suffix)
+	txt := strings.TrimSuffix(sf.String(), suf)
+	return def_spec_base.ATxt(txt)
+}
+
+// Rune -- возвращает внутреннюю строку в виде рун.
+func (sf LetTxt) Rune() []rune {
+	return []rune(sf.Get())
+}
+
+// Byte -- возвращает внутреннюю строку в виде байтов.
+func (sf LetTxt) Byte() []byte {
+	return []byte(sf.Get())
+}
+
+// Len -- возвращает длину строки.
+func (sf LetTxt) Len() def_spec_base.Int {
+	return def_spec_base.Int(len(sf.Get()))
+}
+
+// String -- возвращает строку по требованию.
+func (sf LetTxt) String() string {
+	return string(sf.Get())
+}
+
+// Atoi -- возвращает возможное число.
+func (sf LetTxt) Atoi() *result.Result[def_spec_base.Int] {
+	iRes, err := strconv.Atoi(sf.String())
+	if err != nil {
+		err := fmt.Errorf("LetTxt.Atot(): val(%q) not Int, err=\n\t%w",
+			sf.String(), err)
+		return result.NewErr[def_spec_base.Int](err)
+	}
+	return result.NewOk(def_spec_base.Int(iRes))
+}

+ 56 - 0
v4/lev0/defs/def_move/def_box.go

@@ -0,0 +1,56 @@
+// package def_move -- параметрический контейнер с семантикой перемещения.
+package def_move
+
+import (
+	"reflect"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+)
+
+// Move -- параметрический контейнер с семантикой перемещения
+type Move[T any] struct {
+	type_ def_spec.ATxt
+	val   *T // Фактическое значение
+}
+
+const (
+	str5 = def_spec.ATxt("NewBox(): val==nil")
+)
+
+// NewMove -- возвращает новый параметрический контейнер с семантикой перемещения
+func NewMove[T any](val T) *Move[T] {
+	v := reflect.ValueOf(val)
+	switch v.Kind() {
+	case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
+		isNil := def_spec.Bool(v.IsNil())
+		helpers.If(isNil).Hassert(str5)
+	}
+	sf := &Move[T]{
+		val:   &val,
+		type_: def_spec.Sprintf("%T", val),
+	}
+	_ = def_spec.IFixBox[T](sf)
+	_ = def_spec.IMutBox[T](sf)
+	return sf
+}
+
+// Set -- устанавливает внутреннее значение
+func (sf *Move[T]) Set(val T) {
+	v := reflect.ValueOf(val)
+	switch v.Kind() {
+	case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
+		isNil := def_spec.Bool(v.IsNil())
+		helpers.If(isNil).Hassert(str5)
+	}
+	sf.val = &val
+}
+
+// Move -- перемещает другому владельцу хранимое значение
+func (sf *Move[T]) Move() T {
+	defer func() {
+		sf.val = nil
+	}()
+	helpers.If(sf.val == nil).Hassert("Box.Move[%v]: val already moved", sf.type_)
+	return *sf.val
+}

+ 22 - 0
v4/lev0/defs/def_mut/def_mut.go

@@ -0,0 +1,22 @@
+// package def_mut -- параметрический изменяемый контейнер
+package def_mut
+
+// Mut -- параметрический изменяемый контейнер
+type Mut[T any] struct {
+	val T
+}
+
+// NewMut -- возвращает новый параметрический изменяемый контейнер
+func NewMut[T any](val T) *Mut[T] {
+	return &Mut[T]{val: val}
+}
+
+// Get -- возвращает хранимое значение
+func (sf *Mut[T]) Get() T {
+	return sf.val
+}
+
+// Set -- устанавливает хранимое значение
+func (sf *Mut[T]) Set(val T) {
+	sf.val = val
+}

+ 71 - 0
v4/lev0/defs/def_mut_txt/def_mut_txt.go

@@ -0,0 +1,71 @@
+// package def_mut_txt -- изменяемая строка
+package def_mut_txt
+
+import (
+	"fmt"
+	"strconv"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_mut"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_fn"
+)
+
+// MutTxt -- алиас для внутренней изменяемой строки.
+type MutTxt struct {
+	*def_mut.Mut[def_spec.ATxt]
+}
+
+// NewMutTxt -- создать новую мутабельную строку.
+func NewMutTxt[T def_spec.TxtConstraint](msg T, arg ...any) *MutTxt {
+	_txt := def_spec.Sprintf(msg, arg...)
+	sf := &MutTxt{
+		Mut: def_mut.NewMut(_txt),
+	}
+	return sf
+}
+
+// Concat -- создать новую строку.
+func (sf *MutTxt) Concat(msg any, arg ...any) def_spec.ATxt {
+	val := def_spec.Sprintf("%v", msg)
+	val = def_spec.Sprintf(val, arg...)
+	sf.Set(sf.Get() + val)
+	return sf.Get()
+}
+
+// TrimSuffix -- обрезает суффикс строки.
+func (sf *MutTxt) TrimSuffix(suffix any) def_spec.ATxt {
+	suf := fmt.Sprintf("%v", suffix)
+	txt := def_spec_fn.TrimSuffix(sf.Get(), suf)
+	return def_spec.ATxt(txt)
+}
+
+// Rune -- возвращает внутреннюю строку в виде рун.
+func (sf MutTxt) Rune() []rune {
+	return []rune(sf.Get())
+}
+
+// Byte -- возвращает внутреннюю строку в виде байтов.
+func (sf MutTxt) Byte() []byte {
+	return []byte(sf.Get())
+}
+
+// Len -- возвращает длину строки.
+func (sf MutTxt) Len() def_spec.Int {
+	return def_spec.Int(len(sf.Get()))
+}
+
+// String -- возвращает строку по требованию.
+func (sf MutTxt) String() string {
+	return string(sf.Get())
+}
+
+// Atoi -- возвращает возможное число.
+func (sf MutTxt) Atoi() *def_spec.Result[def_spec.Int] {
+	iRes, err := strconv.Atoi(sf.String())
+	if err != nil {
+		err := fmt.Errorf("LetTxt.Atot(): val(%q) not Int, err=\n\t%w",
+			sf.String(), err)
+		return def_spec.NewErr[def_spec.Int](err)
+	}
+	return def_spec.NewOk(def_spec.Int(iRes))
+}

+ 47 - 0
v4/lev0/defs/def_num/def_num.go

@@ -0,0 +1,47 @@
+// package def_num -- базовый тип числа
+package def_num
+
+import (
+	"fmt"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+)
+
+// Num -- внутренне представление числа
+type Num struct {
+	val def_spec.AInt
+}
+
+// NewNum -- возвращает целое число по требованию.
+func NewNum(val def_spec.AInt) *Num {
+	sf := &Num{
+		val: val,
+	}
+	return sf
+}
+
+// Get -- возвращает внутреннее число
+func (sf *Num) Get() def_spec.AInt {
+	return sf.val
+}
+
+// Int -- возвращает число
+func (sf *Num) Int() int {
+	return int(sf.val)
+}
+
+// Byte -- возвращает число как byte
+func (sf *Num) Byte() *def_spec.Result[byte] {
+	if -128 <= sf.val && sf.val <= 127 {
+		return result.NewOk(byte(sf.val))
+	}
+	err := def_err.Err("Num.Byte(). val(%v) not in -128..127", sf.val)
+	return result.NewErr[byte](err)
+}
+
+// String -- возвращает строку
+func (sf *Num) String() string {
+	return fmt.Sprintf("%v", sf.Get())
+}

+ 0 - 4
v4/lev0/defs/def_spec/def_bool.go

@@ -1,4 +0,0 @@
-package def_spec
-
-// Bool -- внутренее представление логического значения.
-type Bool bool

+ 14 - 0
v4/lev0/defs/def_spec/def_box.go

@@ -0,0 +1,14 @@
+package def_spec
+
+// IFixBox -- фиксированный контейнер
+type IFixBox[T any] interface {
+	// Move -- перемещает другому владельцу значение
+	Move() T
+}
+
+// IMutBox -- изменяемый контейнер
+type IMutBox[T any] interface {
+	IFixBox[T]
+	// Set -- устанавливает хранимое значение
+	Set(T)
+}

+ 22 - 0
v4/lev0/defs/def_spec/def_num.go

@@ -0,0 +1,22 @@
+package def_spec
+
+// AInt -- внутренне представление числа
+type AInt int
+
+// INum -- интерфейс к числу.
+type INum interface {
+	IString
+	// Get -- возвращает внутренее число
+	Get() AInt
+	// Int -- возвращает внутреннее число как int
+	Int() int
+	// Byte -- возвращает внутреннее число как byte
+	Byte() *Result[byte]
+}
+
+// INumMut -- интерфейс к изменяемому внутреннему числу
+type INumMut interface {
+	INum
+	// Set -- устанавливает внутренее число
+	Set(AInt)
+}

+ 0 - 23
v4/lev0/defs/def_spec/def_result.go

@@ -1,23 +0,0 @@
-package def_spec
-
-// IResult -- возвращаемый результат.
-type IResult[T any] interface {
-	// IsOk -- возвращает true, если Result содержит значение.
-	IsOk() Bool
-	// IsErr -- возвращает true, если Result содержит ошибку.
-	IsErr() Bool
-	// Ok -- возвращает значение, если оно есть, иначе паникует.
-	Ok() T
-	// OkOr -- возвращает значение, если оно есть, или значение по умолчанию.
-	OkOr(defaultValue T) T
-	// OkOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
-	OkOrFn(fn func() T) T
-	// Err -- возвращает ошибку, если она есть.
-	Err() error
-	// Error -- возвращает строковое представление ошибки, если она есть.
-	Error() string
-	// Hassert -- проверяет, что нет ошибки (с паникой).
-	Hassert(msgFormat ATxt, args ...any) T
-	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-	Assert(msgFormat ATxt, args ...any) T
-}

+ 29 - 14
v4/lev0/defs/def_spec/def_spec.go

@@ -2,27 +2,42 @@
 package def_spec
 
 import (
-	"fmt"
+	"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/result"
 )
 
+// ATxt -- алиас для внутренней строки.
+type ATxt = def_spec_base.ATxt
+
 // Int -- алиас для int.
-type Int int
+type Int = def_spec_base.Int
 
-// ATxt -- алиас для внутренней строки.
-type ATxt string
+// Bool -- внутренее представление логического значения.
+type Bool = def_spec_base.Bool
 
 // IString -- интерфейс к стандартной строке.
-type IString interface {
-	// String -- возвращает стандартную строку
-	String() string
-}
+type IString = def_spec_fn.IString
 
-// Sprintf -- форматирует строку с помощью fmt.Sprintf.
-func Sprintf[T TxtConstraint](msgFmt T, args ...interface{}) ATxt {
-	return ATxt(fmt.Sprintf(string(msgFmt), args...))
+// TxtConstraint -- разрешает строки и любые типы на его основе (например, ATxt).
+type TxtConstraint = def_spec_fn.TxtConstraint
+
+// Result — обёртка вокруг результата с возможной ошибкой.
+//
+// Может быть либо только полезное значение, либо только ошибка.
+type Result[T any]=result.Result[T]
+
+// NewOk -- возвращает успешный Result с значением.
+func NewOk[T any](value T) *Result[T] {
+	return result.NewOk(value)
 }
 
-// TxtConstraint -- разрешает строки и любые типы на его основе (например, ATxt).
-type TxtConstraint interface {
-	~string
+// NewErr -- возвращает Result с ошибкой.
+func NewErr[T any](err error) *Result[T] {
+	return result.NewErr[T](err)
 }
+
+// Sprintf -- форматирует базовуб строку
+func Sprintf[T def_spec_fn.TxtConstraint](format T, args ...any) ATxt {
+	return def_spec_fn.Sprintf(format, args...)
+}

+ 5 - 3
v4/lev0/defs/def_spec/def_tuf.go

@@ -1,9 +1,11 @@
 package def_spec
 
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+
 // ITuf -- интерфейс сериализатора.
 type ITuf interface {
 	// ToTuf -- сериализация
-	ToTuf() ATxt
+	ToTuf() def_spec_base.ATxt
 	// FromTuf -- десериализация
-	FromTuf(data ATxt) IOption[IErr]
-}
+	FromTuf(data def_spec_base.ATxt) IOption[IErr]
+}

+ 2 - 2
v4/lev0/defs/def_spec/def_txt.go

@@ -15,8 +15,8 @@ type ITxtFix interface {
 	TrimSuffix(any) ITxtFix
 	// Concat -- объединяет строки
 	Concat(msg any, arg ...any) ITxtFix
-	// Atoi -- пытается еовертироватьв число
-	Atoi() IResult[Int]
+	// Atoi -- пытается конвертировать в число
+	Atoi() *Result[Int]
 }
 
 // ITxtMut -- интерфейс к изменяемой внутренней строке.

+ 11 - 0
v4/lev0/defs/def_spec_base/def_spec_base.go

@@ -0,0 +1,11 @@
+// package def_spec_base -- базовые типы фреймворка
+package def_spec_base
+
+// Int -- алиас для int.
+type Int int
+
+// ATxt -- алиас для внутренней строки.
+type ATxt string
+
+// Bool -- внутренее представление логического значения.
+type Bool bool

+ 54 - 0
v4/lev0/defs/def_spec_fn/def_spec_fn.go

@@ -0,0 +1,54 @@
+// package def_spec_fn -- набор функций базовых спецификаций
+package def_spec_fn
+
+import (
+	"fmt"
+	"strconv"
+	"strings"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+)
+
+// Int -- алиас для int.
+type Int = def_spec_base.Int
+
+// Bool -- внутренее представление логического значения.
+type Bool = def_spec_base.Bool
+
+// ATxt -- алиас для внутренней строки.
+type ATxt = def_spec_base.ATxt
+
+// IString -- интерфейс к стандартной строке.
+type IString interface {
+	// String -- возвращает стандартную строку
+	String() string
+}
+
+// TxtConstraint -- разрешает строки и любые типы на его основе (например, ATxt).
+type TxtConstraint interface {
+	~string
+}
+
+// Sprintf -- форматирует строку с помощью fmt.Sprintf.
+func Sprintf[T TxtConstraint](txt T, args ...interface{}) ATxt {
+	return ATxt(fmt.Sprintf(string(txt), args...))
+}
+
+// TrifSuffix -- обрезает суффикс строки
+func TrimSuffix[T TxtConstraint](txt T, suffix any) ATxt {
+	suf := fmt.Sprintf("%v", suffix)
+	_txt := strings.TrimSuffix(string(txt), suf)
+	return ATxt(_txt)
+}
+
+// Atoi -- возвращает возможное число.
+func Atoi[T TxtConstraint](txt T) *result.Result[Int] {
+	iRes, err := strconv.Atoi(string(txt))
+	if err != nil {
+		err := fmt.Errorf("LetTxt.Atot(): val(%q) not Int, err=\n\t%w",
+			txt, err)
+		return result.NewErr[Int](err)
+	}
+	return result.NewOk(Int(iRes))
+}

+ 5 - 5
v4/lev0/defs/def_txt/def_txt.go

@@ -7,7 +7,6 @@ import (
 	"strings"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // KTxt -- алиас для внутренней строки.
@@ -85,11 +84,12 @@ func (sf KTxt) String() string {
 }
 
 // Atoi -- возвращает возможное число.
-func (sf KTxt) Atoi() def_spec.IResult[def_spec.Int] {
+func (sf KTxt) Atoi() *def_spec.Result[def_spec.Int] {
 	iRes, err := strconv.Atoi(sf.String())
 	if err != nil {
-		err := fmt.Errorf("KTxt.Atot(): val(%q) not Int, err=\n\t%w", sf.val, err)
-		return result.NewErr[def_spec.Int](err)
+		err := fmt.Errorf("KTxt.Atot(): val(%q) not Int, err=\n\t%w",
+			sf.val, err)
+		return def_spec.NewErr[def_spec.Int](err)
 	}
-	return result.NewOk(def_spec.Int(iRes))
+	return def_spec.NewOk(def_spec.Int(iRes))
 }

+ 3 - 5
v4/lev0/defs/defs.go

@@ -46,16 +46,14 @@ func Err(msg ATxt, arg ...any) IErr {
 	return def_err.Err(msg, arg...)
 }
 
-
-
 // BucketName -- имя сущности.
 type BucketName ITxtFix
 
 // ITuf -- интерфейс к сериализатору TUF.
 type ITuf = def_spec.ITuf
 
-// IResult -- результат выполнения.
-type IResult[T any] = def_spec.IResult[T]
+// Result -- результат выполнения.
+type Result[T any] = def_spec.Result[T]
 
 // IOption -- опциональный результат.
 type IOption[T any] = def_spec.IOption[T]
@@ -68,4 +66,4 @@ func NewSome[T any](val T) IOption[T] {
 // NewNone -- создать новый опциональный результат.
 func NewNone[T any]() IOption[T] {
 	return option.NewNone[T]()
-}
+}

+ 31 - 40
v4/lev0/helpers/helpers.go

@@ -8,71 +8,44 @@ import (
 	"log"
 	"os"
 	"time"
+	"reflect"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
 )
 
 var (
-	IsStageLocal bool
-	IsStageProd  bool
+	IsStageLocal def_spec_base.Bool
+	IsStageProd  def_spec_base.Bool
 )
 
-// FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
-//
-//	(isCond bool, msgFormat defs.Str, args ...any)
-// type FnAssert func(isCond bool, msgFormat def_spec.ATxt, args ...any)
-
-// Assert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
-// func Assert(isCond bool, msgFormat def_spec.ATxt, args ...any) {
-// 	if isCond {
-// 		return
-// 	}
-// 	msg := def_spec.Sprintf("SOFT ASSERT "+msgFormat+"\n", args...)
-// 	if IsStageLocal {
-// 		panic(msg)
-// 	}
-// 	log.Print(msg)
-// }
-
-// IAssertAction -- действие, которое будет выполнено при проверке.
-type IAssertAction interface {
-	// Assert -- жёсткое падение кроме прода
-	Assert(msgFormat def_spec.ATxt, args ...any)
-	// Hassert -- жёсткое падение даже на проде
-	Hassert(msgFormat def_spec.ATxt, args ...any)
-}
-
-type IfAction func(msgFormat def_spec.ATxt, args ...any)
 
 type AssertAction struct {
-	isCond def_spec.Bool
+	isCond def_spec_base.Bool
 }
 
 // Hassert -- проверка на правильность утверждения с безусловным падением в панику даже на проде (hard assert).
-func (sf *AssertAction) Hassert(msgFormat def_spec.ATxt, args ...any) {
+func (sf *AssertAction) Hassert(msgFormat def_spec_base.ATxt, args ...any) {
 	if !sf.isCond {
 		return
 	}
-	msg := def_spec.Sprintf("HARD ASSERT "+msgFormat+"\n", args...)
+	msg := fmt.Sprintf("HARD ASSERT "+string(msgFormat)+"\n", args...)
 	panic(msg)
 }
 
 // Assert -- проверка на правильность утверждения с падением в панику кроме прода (soft assert).
-func (sf *AssertAction) Assert(msgFormat def_spec.ATxt, args ...any) {
+func (sf *AssertAction) Assert(msgFormat def_spec_base.ATxt, args ...any) {
 	if !sf.isCond {
 		return
 	}
-	msg := def_spec.Sprintf("SOFT ASSERT "+msgFormat+"\n", args...)
+	msg := fmt.Sprintf("SOFT ASSERT"+string(msgFormat)+"\n", args...)
 	if IsStageLocal {
 		panic(msg)
 	}
 	log.Print(msg)
 }
 
-type FnIf func(isCond def_spec.Bool) IAssertAction
-
 // If -- условие для проверки.
-func If(isCond def_spec.Bool) IAssertAction {
+func If(isCond def_spec_base.Bool) *AssertAction {
 	sf := &AssertAction{
 		isCond: isCond,
 	}
@@ -82,14 +55,14 @@ func If(isCond def_spec.Bool) IAssertAction {
 // FnHassert -- проверяет с жёстким падением условие.
 //
 //	(isCond bool, msgFormat defs.Str, args ...any)
-// type FnHassert func(isCond def_spec.Bool, msgFormat def_spec.ATxt, args ...any)
+// type FnHassert func(isCond d_ef_spec.Bool, msgFormat d_ef_spec.ATxt, args ...any)
 
 // Hassert -- проверка на правильность утверждения с безусловным падением в панику (hard assert).
-// func Hassert(isCond def_spec.Bool, msgFormat def_spec.ATxt, args ...any) {
+// func Hassert(isCond d_ef_spec.Bool, msgFormat d_ef_spec.ATxt, args ...any) {
 // 	if isCond {
 // 		return
 // 	}
-// 	msg := def_spec.Sprintf("HARD ASSERT "+msgFormat+"\n", args...)
+// 	msg := d_ef_spec.Sprintf("HARD ASSERT "+msgFormat+"\n", args...)
 // 	panic(msg)
 // }
 
@@ -121,6 +94,24 @@ func init_() {
 	}
 }
 
+// IsNil -- проверяет абсолютно любой Go-объект на nil.
+// Она безопасно обрабатывает как прямые nil-значения, так и "типизированные" nil
+// (когда интерфейс содержит внутри себя nil-указатель).
+func IsNil(i any) def_spec_base.Bool {
+	if i == nil {
+		return true
+	}
+
+	val := reflect.ValueOf(i)
+	switch val.Kind() {
+	case reflect.Pointer, reflect.Chan, reflect.Map, reflect.Slice, reflect.Func, reflect.Interface:
+		return def_spec_base.Bool(val.IsNil())
+	default:
+		// Все остальные типы (структуры, int, string, bool) не могут быть nil
+		return false
+	}
+}
+
 func init() {
 	init_()
 }

+ 10 - 13
v4/lev0/lev0.go

@@ -2,14 +2,11 @@
 package lev0
 
 import (
-	"time"
-
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/option"
-	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // ETime -- расширенное время.
@@ -19,21 +16,21 @@ type ETime = mKs.ITime
 type EStr = mKs.EStr
 
 // Result — обёртка вокруг результата с возможной ошибкой.
-type IResult[T any] = def_spec.IResult[T]
+type Result[T any] = result.Result[T]
 
 // NewOk -- возвращает успешный Result с значением.
-func NewOk[T any](res T) IResult[T] {
-	return mRes.NewOk(res)
+func NewOk[T any](res T) *Result[T] {
+	return result.NewOk(res)
 }
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err defs.IErr) IResult[T] {
-	return mRes.NewErr[T](err)
+func NewErr[T any](err defs.IErr) *Result[T] {
+	return result.NewErr[T](err)
 }
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res IResult[T], err defs.IErr) IResult[T] {
-	return mRes.WrapErr(res, err)
+func WrapErr[T any](res *Result[T], err defs.IErr) *Result[T] {
+	return result.WrapErr(res, err)
 }
 
 // IOption — обёртка вокруг результата с возможной пустотой.
@@ -50,9 +47,9 @@ func NewNone[T any]() IOption[T] {
 }
 
 // FnIf -- проверяет с жёстким падением условие.
-type FnIf = helpers.FnIf
+// type FnIf = helpers.FnIf
 
 // SleepMs -- задержка в миллисекундах.
 func SleepMs() {
-	time.Sleep(time.Millisecond * 1)
+	helpers.SleepMs()
 }

+ 6 - 15
v4/lev0/option/option.go

@@ -1,11 +1,9 @@
 package option
 
 import (
-	"reflect"
-
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
-	mH "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
 // Option -- результат возможно содержащий nil.
@@ -15,14 +13,7 @@ type Option[T any] struct {
 
 // NewSome - полезный результат.
 func NewSome[T any](value T) mKs.IOption[T] {
-	// Для некоторых типов нужна дополнительная проверка через reflect
-	v := reflect.ValueOf(value)
-	switch v.Kind() {
-	case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan,
-		reflect.Func, reflect.Interface:
-		isNil := def_spec.Bool(v.IsNil())
-		mH.If(isNil).Hassert("NewSome[T any](): value==nil")
-	}
+	helpers.If(helpers.IsNil(value)).Hassert("NewSome[T any](): value==nil")
 	sf := &Option[T]{some: &value}
 	return sf
 }
@@ -46,7 +37,7 @@ func (sf *Option[T]) IsNone() bool {
 
 // Some - извлекает значение (паника, если None).
 func (sf *Option[T]) Some() T {
-	mH.If(sf.some == nil).Hassert("Option[T].Some(): val==nil!")
+	helpers.If(sf.some == nil).Hassert("Option[T].Some(): val==nil!")
 	return *sf.some
 }
 
@@ -60,7 +51,7 @@ func (sf Option[T]) SomeOr(defaultValue T) T {
 
 // SomeOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
 func (sf *Option[T]) SomeOrFn(fn func() T) T {
-	mH.If(fn == nil).Hassert("Option[T].SomeOrFn(): fn==nil")
+	helpers.If(fn == nil).Hassert("Option[T].SomeOrFn(): fn==nil")
 	if sf.some == nil {
 		return fn()
 	}
@@ -69,12 +60,12 @@ func (sf *Option[T]) SomeOrFn(fn func() T) T {
 
 // Hassert -- проверяет, что не пустое значение (с паникой).
 func (sf *Option[T]) Hassert(msgFormat def_spec.ATxt, args ...any) T {
-	mH.If(sf.some == nil).Hassert(msgFormat, args...)
+	helpers.If(sf.some == nil).Hassert(msgFormat, args...)
 	return *sf.some
 }
 
 // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
 func (sf *Option[T]) Assert(msgFormat def_spec.ATxt, args ...any) T {
-	mH.If(sf.some == nil).Assert(msgFormat, args...)
+	helpers.If(sf.some == nil).Assert(msgFormat, args...)
 	return *sf.some
 }

+ 35 - 40
v4/lev0/result/result.go

@@ -2,35 +2,28 @@ package result
 
 import (
 	"fmt"
-	"reflect"
 	"runtime"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
-	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
 // Result — обёртка вокруг результата с возможной ошибкой.
 //
 // Может быть либо только полезное значение, либо только ошибка.
 type Result[T any] struct {
-	val     T             // Полезное значение
-	isCheck def_spec.Bool // Если проверено
-	err     error         // Ошибка
+	val     T                  // Полезное значение
+	isCheck def_spec_base.Bool // Если проверено
+	err     error              // Ошибка
 }
 
-var (
-	str5 = def_spec.ATxt("NewOk(): result==nil")
+const (
+	str5 = def_spec_base.ATxt("NewOk(): result==nil")
 )
 
 // NewOk -- возвращает успешный Result с значением.
-func NewOk[T any](result T) def_spec.IResult[T] {
-	// Для некоторых типов нужна дополнительная проверка через reflect
-	v := reflect.ValueOf(result)
-	switch v.Kind() {
-	case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
-		isNil := def_spec.Bool(v.IsNil())
-		mKh.If(isNil).Hassert(str5)
-	}
+func NewOk[T any](result T) *Result[T] {
+	helpers.If(helpers.IsNil(result)).Hassert(str5)
 	sf := &Result[T]{
 		val: result,
 	}
@@ -39,12 +32,12 @@ func NewOk[T any](result T) def_spec.IResult[T] {
 }
 
 var (
-	str6 = def_spec.ATxt("NewErr(): err==nil")
+	str6 = def_spec_base.ATxt("NewErr(): err==nil")
 )
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) def_spec.IResult[T] {
-	mKh.If(err == nil).Hassert(str6)
+func NewErr[T any](err error) *Result[T] {
+	helpers.If(err == nil).Hassert(str6)
 	sf := &Result[T]{
 		err: err,
 	}
@@ -53,14 +46,14 @@ func NewErr[T any](err error) def_spec.IResult[T] {
 }
 
 var (
-	str7 = def_spec.ATxt("WrapErr(): result not have error")
-	str8 = def_spec.ATxt("WrapErr(): err==nil")
+	str7 = def_spec_base.ATxt("WrapErr(): result not have error")
+	str8 = def_spec_base.ATxt("WrapErr(): err==nil")
 )
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res def_spec.IResult[T], err error) def_spec.IResult[T] {
-	mKh.If(res.IsOk()).Hassert(str7)
-	mKh.If(err == nil).Hassert(str8)
+func WrapErr[T any](res *Result[T], err error) *Result[T] {
+	helpers.If(res.IsOk()).Hassert(str7)
+	helpers.If(err == nil).Hassert(str8)
 	err0 := res.Err() // Чтобы не было паники при финализации и обернуть ошибку
 	err = fmt.Errorf("%v, err=\n\t%w", err0, err)
 	sf := NewErr[T](err)
@@ -68,28 +61,28 @@ func WrapErr[T any](res def_spec.IResult[T], err error) def_spec.IResult[T] {
 }
 
 var (
-	str9 = def_spec.ATxt("Result[T].destroy(): err not checked")
+	str9 = def_spec_base.ATxt("Result[T].destroy(): err not checked")
 )
 
 func (sf *Result[T]) destroy(res *Result[T]) {
-	mKh.If(!res.isCheck).Hassert(str9)
+	helpers.If(!res.isCheck).Hassert(str9)
 }
 
 // IsOk -- возвращает true, если Result содержит значение.
-func (sf *Result[T]) IsOk() def_spec.Bool {
+func (sf *Result[T]) IsOk() def_spec_base.Bool {
 	sf.isCheck = true
 	return sf.err == nil
 }
 
 // IsErr -- возвращает true, если Result содержит ошибку.
-func (sf *Result[T]) IsErr() def_spec.Bool {
+func (sf *Result[T]) IsErr() def_spec_base.Bool {
 	sf.isCheck = true
 	return sf.err != nil
 }
 
 // Ok -- возвращает значение, если оно есть, иначе паникует.
 func (sf *Result[T]) Ok() T {
-	mKh.If(sf.err != nil).Hassert("Result[T].Ok(): err!=nil, err=\n\t%v", sf.err)
+	helpers.If(sf.err != nil).Hassert("Result[T].Ok(): err!=nil, err=\n\t%v", sf.err)
 	sf.isCheck = true
 	return sf.val
 }
@@ -105,12 +98,12 @@ func (sf *Result[T]) OkOr(defaultValue T) T {
 }
 
 var (
-	str11 = def_spec.ATxt("Result[T].OkOrFn(): fn==nil")
+	str11 = def_spec_base.ATxt("Result[T].OkOrFn(): fn==nil")
 )
 
 // OkOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
 func (sf *Result[T]) OkOrFn(fn func() T) T {
-	mKh.If(fn == nil).Hassert(str11)
+	helpers.If(fn == nil).Hassert(str11)
 	sf.isCheck = true
 	if sf.err != nil {
 		sf.val = fn()
@@ -120,12 +113,12 @@ func (sf *Result[T]) OkOrFn(fn func() T) T {
 }
 
 var (
-	str12 = def_spec.ATxt("Result[T].Err(): err==nil")
+	str12 = def_spec_base.ATxt("Result[T].Err(): err==nil")
 )
 
 // Err -- возвращает ошибку, если она есть.
 func (sf *Result[T]) Err() error {
-	mKh.If(sf.err == nil).Hassert(str12)
+	helpers.If(sf.err == nil).Hassert(str12)
 	sf.isCheck = true
 	return sf.err
 }
@@ -134,26 +127,28 @@ const str13 = "Result[T].Error(): err==nil"
 
 // Error -- возвращает строковое представление ошибки, если она есть.
 func (sf *Result[T]) Error() string {
-	mKh.If(sf.err == nil).Hassert(str13)
+	helpers.If(sf.err == nil).Hassert(str13)
 	sf.isCheck = true
 	return sf.err.Error()
 }
 
 // Hassert -- проверяет, что нет ошибки (с паникой).
-func (sf *Result[T]) Hassert(msgFormat def_spec.ATxt, args ...any) T {
+func (sf *Result[T]) Hassert(msgFormat def_spec_base.ATxt, args ...any) T {
 	if sf.err != nil {
-		txtErr := def_spec.Sprintf("Result[T].Hassert(): have error, err=\n\t%v", sf.err)
-		mKh.If(sf.err != nil).Hassert(txtErr)
+		txtErr := fmt.Sprintf("Result[T].Hassert(): have error, err=\n\t%v", sf.err)
+		msgErr := def_spec_base.ATxt(txtErr)
+		helpers.If(sf.err != nil).Hassert(msgErr)
 	}
 	sf.isCheck = true
 	return sf.val
 }
 
 // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
-func (sf *Result[T]) Assert(msgFormat def_spec.ATxt, args ...any) T {
+func (sf *Result[T]) Assert(msgFormat def_spec_base.ATxt, args ...any) T {
 	if sf.err != nil {
-		txtErr := def_spec.Sprintf("Result[T].Assert(): have error, , err=\n\t%v", sf.err)
-		mKh.If(sf.err != nil).Assert(txtErr, args...)
+		strErr := fmt.Sprintf("Result[T].Assert(): have error, , err=\n\t%v", sf.err)
+		txtErr:=def_spec_base.ATxt(strErr)
+		helpers.If(sf.err != nil).Assert(txtErr, args...)
 	}
 	sf.isCheck = true
 	return sf.val

+ 18 - 17
v4/lev0/result/result_test.go

@@ -5,7 +5,8 @@ import (
 	"runtime"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_let"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
 )
 
 type tester struct {
@@ -22,7 +23,7 @@ func TestResult(t *testing.T) {
 }
 
 const (
-	str1 = def_spec.ATxt("test result")
+	str1 = def_spec_base.ATxt("test result")
 )
 
 // Создаёт новый результат и не проверяет его.
@@ -42,8 +43,8 @@ func (sf *tester) notCheck() {
 	}
 	runtime.Gosched()
 	runtime.GC()
-	_res := res.(*Result[def_spec.ATxt])
-	_res.destroy(_res)
+	// _res := res.(*Result[def_spec_base.ATxt])
+	res.destroy(res)
 }
 
 // Создаёт новый Result.
@@ -103,7 +104,7 @@ func (sf *tester) createErrGood1() {
 }
 
 var (
-	str2 = def_spec.ATxt("test assert2")
+	str2 = def_spec_base.ATxt("test assert2")
 )
 
 func (sf *tester) assert2() {
@@ -119,10 +120,10 @@ func (sf *tester) assert2() {
 }
 
 var (
-	str3 = def_spec.ATxt("test hassert2")
+	str3 = def_spec_base.ATxt("test hassert2")
 )
 
-func (sf *tester) hassert2(res def_spec.IResult[error]) {
+func (sf *tester) hassert2(res *Result[error]) {
 	sf.t.Log("hassert2")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -133,10 +134,10 @@ func (sf *tester) hassert2(res def_spec.IResult[error]) {
 }
 
 var (
-	str4 = def_spec.ATxt("test assert")
+	str4 = def_spec_base.ATxt("test assert")
 )
 
-func (sf *tester) hassert(res def_spec.IResult[error]) {
+func (sf *tester) hassert(res *Result[error]) {
 	sf.t.Log("hassert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -146,7 +147,7 @@ func (sf *tester) hassert(res def_spec.IResult[error]) {
 	_ = res.Hassert(str4)
 }
 
-func (sf *tester) unwrapErr(res def_spec.IResult[error]) {
+func (sf *tester) unwrapErr(res *Result[error]) {
 	sf.t.Log("unwrapErr")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -164,12 +165,12 @@ func (sf *tester) createErrBad1() {
 			sf.t.Fatalf("createErrBad1(): panic==nil")
 		}
 	}()
-	var err def_spec.IErr
-	_ = NewErr[def_spec.IErr](err)
+	var err error
+	_ = NewErr[error](err)
 }
 
 var (
-	str = def_spec.ATxt("test val")
+	str = def_spec_base.ATxt("test val")
 )
 
 func (sf *tester) createOkGood2() {
@@ -189,7 +190,7 @@ func (sf *tester) createOkGood2() {
 	if val := res.Ok(); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	txt1 := def_spec.ATxt("test1")
+	txt1 := def_spec_base.ATxt("test1")
 	if val := res.OkOr(txt1); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
@@ -203,7 +204,7 @@ func (sf *tester) createOkGood2() {
 	if err := res0.Err(); err == nil {
 		sf.t.Fatalf("createOkGood1(): err==nil")
 	}
-	str1 := def_spec.ATxt("test assert")
+	str1 := def_spec_base.ATxt("test assert")
 	res.Hassert(str1)
 	res.Assert(str1)
 }
@@ -214,7 +215,7 @@ func (sf *tester) fnWrap2() error {
 }
 
 // Функция высшего порядка для замещения ошибки.
-func (sf *tester) fnWrap() def_spec.ATxt {
+func (sf *tester) fnWrap() def_spec_base.ATxt {
 	return "test1"
 }
 
@@ -237,6 +238,6 @@ func (sf *tester) createOkBad1() {
 			sf.t.Fatalf("createOkBad1(): panic==nil")
 		}
 	}()
-	var str def_spec.ITxtFix
+	var str *def_let.Let[def_spec_base.ATxt]
 	_ = NewOk(str)
 }

+ 1 - 1
v4/lev0/tuf/tuf.go

@@ -34,7 +34,7 @@ func RecToTuf(type_, val def_spec.ATxt) def_spec.ATxt {
 }
 
 // RecFromTuf -- конвертация записи из TUF.
-func RecFromTuf(type_, val def_spec.ATxt) def_spec.IResult[def_spec.ATxt] {
+func RecFromTuf(type_, val def_spec.ATxt) *def_spec.Result[def_spec.ATxt] {
 	keyCheck(type_)
 	lstField := strings.Split(string(val), ";")
 	if len(lstField) != 3 {

+ 3 - 2
v4/lev1/comp_spec/ilog_buf.go

@@ -1,7 +1,8 @@
 package comp_spec
 
 import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+		"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf/log_msg"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
@@ -14,7 +15,7 @@ type ILogMsg = log_msg.ILogMsg
 // ILogBus -- публикует в топики логи.
 type ILogBus interface {
 	// DebugAdd -- добавляет топик для отладочного сообщения
-	DebugAdd(topic bus_ent.ITopicFix, bus bus_spec.IBusClient) core_spec.IResult[core_spec.EBool]
+	DebugAdd(topic bus_ent.ITopicFix, bus bus_spec.IBusClient) *lev0.Result[core_spec.EBool]
 }
 
 // ILogBuf -- буферизованный лог для диагностики.

+ 11 - 11
v4/lev1/kint/kint.go

@@ -7,7 +7,7 @@ import (
 	"os"
 	"strconv"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
@@ -51,14 +51,14 @@ func (sf *KernInt) Reset() {
 }
 
 // FromStr -- устанавливает значение из строки.
-func (sf *KernInt) FromStr(strVal defs.ITxtFix) mL0.IResult[defs.Int] {
+func (sf *KernInt) FromStr(strVal defs.ITxtFix) *lev0.Result[defs.Int] {
 	iVal, err := strconv.Atoi(strVal.String())
 	if err != nil {
 		err := defs.Err("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err)
-		return mL0.NewErr[defs.Int](err)
+		return lev0.NewErr[defs.Int](err)
 	}
 	sf.val = defs.Int(iVal)
-	return mL0.NewOk(sf.val)
+	return lev0.NewOk(sf.val)
 }
 
 // ToStr -- возвращает как строку.
@@ -67,21 +67,21 @@ func (sf *KernInt) ToStr() defs.ITxtFix {
 }
 
 // FromByte -- устанавливает значение из байтов (BigEndian, net order).
-func (sf *KernInt) FromByte(binData []byte) mL0.IResult[defs.Int] {
+func (sf *KernInt) FromByte(binData []byte) *lev0.Result[defs.Int] {
 	lenBin := len(binData)
 	if lenBin < 8 {
 		err := defs.Err("KInt.FromByte(): len(%v) bytes shorts", lenBin)
-		return mL0.NewErr[defs.Int](err)
+		return lev0.NewErr[defs.Int](err)
 	}
 	var signed int64
 	buf := bytes.NewReader(binData)
 	err := binary.Read(buf, binary.BigEndian, &signed)
 	if err != nil {
 		err := defs.Err("KInt.FromByte(): in read []byte, err=\n\t%w", err)
-		return mL0.NewErr[defs.Int](err)
+		return lev0.NewErr[defs.Int](err)
 	}
 	sf.val = defs.Int(signed)
-	return mL0.NewOk(sf.val)
+	return lev0.NewOk(sf.val)
 }
 
 // ToByte -- возвращает как срез байт.
@@ -107,12 +107,12 @@ func (sf *KernInt) ToBool() defs.Bool {
 }
 
 // Getenv -- устанавливает значение из окружения.
-func (sf *KernInt) Getenv(env defs.ITxtFix) core_spec.IResult[defs.Int] {
+func (sf *KernInt) Getenv(env defs.ITxtFix) *lev0.Result[defs.Int] {
 	strVal := defs.ATxt(os.Getenv(env.String()))
 	res := sf.FromStr(defs.TxtFix(strVal))
 	if res.IsErr() {
 		err := defs.Err("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
-		return mL0.NewErr[defs.Int](err)
+		return lev0.NewErr[defs.Int](err)
 	}
-	return mL0.NewOk(sf.val)
+	return lev0.NewOk(sf.val)
 }

+ 3 - 3
v4/lev1/lev1.go

@@ -5,7 +5,7 @@ import (
 	"context"
 	"time"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 
@@ -44,12 +44,12 @@ func NewSafeString() mKs.ISafeString {
 }
 
 // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
-func NewSafeIntFromStr(strVal defs.ITxtFix) mL0.IResult[mKs.ISafeInt] {
+func NewSafeIntFromStr(strVal defs.ITxtFix) *lev0.Result[mKs.ISafeInt] {
 	return safe_int.NewSafeIntFromStr(strVal)
 }
 
 // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeIntGetenv(env defs.ITxtFix) mL0.IResult[mKs.ISafeInt] {
+func NewSafeIntGetenv(env defs.ITxtFix) *lev0.Result[mKs.ISafeInt] {
 	return safe_int.NewSafeIntGetenv(env)
 }
 

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

@@ -4,7 +4,7 @@ package log_dict_topic
 import (
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
@@ -17,14 +17,14 @@ type LogDictTopic struct {
 }
 
 // NewLogDictTopic -- возвращает новый словарь топиков для логирования.
-func NewLogDictTopic(clientBus bus_spec.IBusClient) mL0.IResult[*LogDictTopic] {
+func NewLogDictTopic(clientBus bus_spec.IBusClient) *lev0.Result[*LogDictTopic] {
 	if clientBus == nil {
 		err := defs.Err("NewLogDictTopic(): clientBus == nil")
-		return mL0.NewErr[*LogDictTopic](err)
+		return lev0.NewErr[*LogDictTopic](err)
 	}
 	sf := &LogDictTopic{
 		dict:   map[topic.ATopic]struct{}{},
 		client: clientBus,
 	}
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }

+ 57 - 0
v4/lev1/mutex/mutex.go

@@ -0,0 +1,57 @@
+// package mutex -- безопасный мьютекс
+package mutex
+
+import (
+	"log"
+	"sync"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+)
+
+type Mutex struct {
+	block  sync.Mutex
+	val    sync.Mutex
+	isLock defs.Bool
+}
+
+// NewMutex -- возвращает новый безопасный мьютекс
+func NewMutex() core_spec.IMutex {
+	sf := &Mutex{}
+	return sf
+}
+
+// Unlock -- освободить мьютекс
+func (sf *Mutex) Unlock() {
+	sf.block.Lock()
+	defer sf.block.Unlock()
+	if !sf.isLock {
+		log.Println("ERROR Mutex.Unlock(): mutex already free")
+		return
+	}
+	sf.val.Unlock()
+	sf.isLock = false
+}
+
+// Lock -- попытка захватить мьютекс
+func (sf *Mutex) Lock() {
+	sf.block.Lock()
+	defer sf.block.Unlock()
+
+	sf.val.Lock()
+	sf.isLock = true
+}
+
+// IsLock -- возвращает признак захвата мьютекса
+func (sf *Mutex) IsLock() defs.Bool {
+	sf.block.Lock()
+	defer sf.block.Unlock()
+	return sf.isLock
+}
+
+// IsFree -- возвращает признак свободного мьютекса
+func (sf *Mutex) IsFree() defs.Bool {
+	sf.block.Lock()
+	defer sf.block.Unlock()
+	return !sf.isLock
+}

+ 13 - 13
v4/lev1/safe_bool/safe_bool.go

@@ -6,7 +6,7 @@ import (
 	"strings"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
@@ -26,25 +26,25 @@ func NewSafeBool(val defs.Bool) core_spec.ISafeBool {
 }
 
 // NewSafeBoolFromStr -- возвращает новое потокобезопасное булево из строки.
-func NewSafeBoolFromStr(strVal defs.ITxtFix) mL0.IResult[core_spec.ISafeBool] {
+func NewSafeBoolFromStr(strVal defs.ITxtFix) *lev0.Result[core_spec.ISafeBool] {
 	sf := NewSafeBool(false)
 	res := sf.FromStr(strVal)
 	if res.IsSome() {
 		err := defs.Err("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Some().Get())
-		return mL0.NewErr[core_spec.ISafeBool](err)
+		return lev0.NewErr[core_spec.ISafeBool](err)
 	}
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // NewSafeBoolGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeBoolGetenv(env defs.ITxtFix) core_spec.IResult[core_spec.ISafeBool] {
+func NewSafeBoolGetenv(env defs.ITxtFix) *lev0.Result[core_spec.ISafeBool] {
 	sf := NewSafeBool(false)
 	res := sf.Getenv(env)
 	if res.IsSome() {
 		err := defs.Err("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Some().Get())
-		return mL0.NewErr[core_spec.ISafeBool](err)
+		return lev0.NewErr[core_spec.ISafeBool](err)
 	}
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // Get -- возвращает хранимый булевый признак.
@@ -69,7 +69,7 @@ func (sf *safeBool) Reset() {
 }
 
 // FromStr -- получает число из строки.
-func (sf *safeBool) FromStr(strVal defs.ITxtFix) core_spec.IOption[defs.IErr] {
+func (sf *safeBool) FromStr(strVal defs.ITxtFix) lev0.IOption[defs.IErr] {
 	_strVal := strings.ToLower(strVal.String())
 	sf.Lock()
 	defer sf.Unlock()
@@ -80,18 +80,18 @@ func (sf *safeBool) FromStr(strVal defs.ITxtFix) core_spec.IOption[defs.IErr] {
 		sf.val = false
 	default:
 		err := defs.Err("safeBool.FromStr(): val(%v) bad", strVal)
-		return mL0.NewSome(err)
+		return lev0.NewSome(err)
 	}
-	return mL0.NewNone[defs.IErr]()
+	return lev0.NewNone[defs.IErr]()
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeBool) Getenv(env defs.ITxtFix) mL0.IOption[defs.IErr] {
+func (sf *safeBool) Getenv(env defs.ITxtFix) lev0.IOption[defs.IErr] {
 	strVal := defs.ATxt(os.Getenv(env.String()))
 	res := sf.FromStr(defs.TxtFix(strVal))
 	if res.IsSome() {
 		err := defs.Err("safeBool.Getenv(): from env %v, err=\n\t%w", env, res.Some().Get())
-		return mL0.NewSome(err)
+		return lev0.NewSome(err)
 	}
-	return mL0.NewNone[defs.IErr]()
+	return lev0.NewNone[defs.IErr]()
 }

+ 16 - 16
v4/lev1/safe_bool_react/safe_bool_react.go

@@ -6,7 +6,7 @@ import (
 	"strings"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"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/lev0/etypes/ebool"
@@ -28,25 +28,25 @@ func NewSafeBoolReact() core_spec.ISafeBoolReact {
 }
 
 // NewSafeBoolReactFromStr -- возвращает новое потокобезопасное булево с реакцией из строки.
-func NewSafeBoolReactFromStr(strVal defs.ITxtFix) mL0.IResult[core_spec.ISafeBoolReact] {
+func NewSafeBoolReactFromStr(strVal defs.ITxtFix) *lev0.Result[core_spec.ISafeBoolReact] {
 	sf := NewSafeBoolReact()
 	res := sf.FromStr(strVal)
 	if res.IsSome() {
 		err := defs.Err("NewSafeBoolReactFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Some().Get())
-		return mL0.NewErr[core_spec.ISafeBoolReact](err)
+		return lev0.NewErr[core_spec.ISafeBoolReact](err)
 	}
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // NewSafeBoolGetenv -- возвращает новое потокобезопасное целое с реакцией из окружения.
-func NewSafeBoolGetenv(env defs.ITxtFix) mL0.IResult[core_spec.ISafeBoolReact] {
+func NewSafeBoolGetenv(env defs.ITxtFix) *lev0.Result[core_spec.ISafeBoolReact] {
 	sf := NewSafeBoolReact()
 	res := sf.Getenv(env)
 	if res.IsSome() {
 		err := defs.Err("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Some().Get())
-		return mL0.NewErr[core_spec.ISafeBoolReact](err)
+		return lev0.NewErr[core_spec.ISafeBoolReact](err)
 	}
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // Delete -- удаляет функцию обратного вызова из наблюдения.
@@ -57,20 +57,20 @@ func (sf *safeBoolReact) Delete(key defs.ITxtFix) {
 }
 
 // Add -- добавляет функцию обратного вызова.
-func (sf *safeBoolReact) Add(key defs.ITxtFix, fn func(core_spec.EBoolMut)) mL0.IResult[bool] {
+func (sf *safeBoolReact) Add(key defs.ITxtFix, fn func(core_spec.EBoolMut)) *lev0.Result[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	if key.Get() == "" {
 		err := defs.Err("safeBoolReact.Add(): key is empty")
-		return mL0.NewErr[bool](err)
+		return lev0.NewErr[bool](err)
 	}
 	_, isOk := sf.dict[key]
 	if isOk {
 		err := defs.Err("safeBoolReact.Add(): key(%v) already exists", key)
-		return mL0.NewErr[bool](err)
+		return lev0.NewErr[bool](err)
 	}
 	sf.dict[key] = fn
-	return mL0.NewOk((true))
+	return lev0.NewOk((true))
 }
 
 // Get -- возвращает хранимый булевый признак.
@@ -112,18 +112,18 @@ func (sf *safeBoolReact) FromStr(strVal defs.ITxtFix) core_spec.IOption[defs.IEr
 		sf.val = false
 	default:
 		err := defs.Err("safeBoolReact.FromStr(): val(%v) bad", strVal)
-		return mL0.NewSome(err)
+		return lev0.NewSome(err)
 	}
-	return mL0.NewNone[defs.IErr]()
+	return lev0.NewNone[defs.IErr]()
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeBoolReact) Getenv(env defs.ITxtFix) mL0.IOption[defs.IErr] {
+func (sf *safeBoolReact) Getenv(env defs.ITxtFix) lev0.IOption[defs.IErr] {
 	strVal := defs.ATxt(os.Getenv(env.String()))
 	res := sf.FromStr(defs.TxtFix(strVal))
 	if res.IsSome() {
 		err := defs.Err("safeBoolReact.Getenv(): from env %v, err=\n\t%w", env, res.Some().Get())
-		return mL0.NewSome[defs.IErr](err)
+		return lev0.NewSome[defs.IErr](err)
 	}
-	return mL0.NewNone[defs.IErr]()
+	return lev0.NewNone[defs.IErr]()
 }

+ 10 - 10
v4/lev1/safe_int/safe_int.go

@@ -4,7 +4,7 @@ package safe_int
 import (
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kint"
@@ -25,25 +25,25 @@ func NewSafeInt(val defs.Int) mKs.ISafeInt {
 }
 
 // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
-func NewSafeIntFromStr(txtVal defs.ITxtFix) mL0.IResult[mKs.ISafeInt] {
+func NewSafeIntFromStr(txtVal defs.ITxtFix) *lev0.Result[mKs.ISafeInt] {
 	sf := NewSafeInt(0)
 	res := sf.FromStr(txtVal)
 	if res.IsErr() {
 		err := defs.Err("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", txtVal, res.Err())
-		return mL0.NewErr[mKs.ISafeInt](err)
+		return lev0.NewErr[mKs.ISafeInt](err)
 	}
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeIntGetenv(env defs.ITxtFix) mL0.IResult[mKs.ISafeInt] {
+func NewSafeIntGetenv(env defs.ITxtFix) *lev0.Result[mKs.ISafeInt] {
 	sf := NewSafeInt(0)
 	res := sf.Getenv(env)
 	if res.IsErr() {
 		err := defs.Err("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
-		return mL0.NewErr[mKs.ISafeInt](err)
+		return lev0.NewErr[mKs.ISafeInt](err)
 	}
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // FromBool -- устанавливает значение из булева значения.
@@ -93,14 +93,14 @@ func (sf *safeInt) Reset() {
 }
 
 // FromStr -- получает число из строки.
-func (sf *safeInt) FromStr(txtVal defs.ITxtFix) mL0.IResult[defs.Int] {
+func (sf *safeInt) FromStr(txtVal defs.ITxtFix) *lev0.Result[defs.Int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.FromStr(txtVal)
 }
 
 // FromByte -- получает число из среза байт.
-func (sf *safeInt) FromByte(binData []byte) mL0.IResult[defs.Int] {
+func (sf *safeInt) FromByte(binData []byte) *lev0.Result[defs.Int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.FromByte(binData)
@@ -128,7 +128,7 @@ func (sf *safeInt) ToStr() defs.ITxtFix {
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeInt) Getenv(env defs.ITxtFix) mL0.IResult[defs.Int] {
+func (sf *safeInt) Getenv(env defs.ITxtFix) *lev0.Result[defs.Int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.Getenv(env)

+ 7 - 7
v4/lev1/safe_string/safe_string.go

@@ -5,7 +5,7 @@ import (
 	"os"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
@@ -23,14 +23,14 @@ func NewSafeString() mKs.ISafeString {
 }
 
 // NewSafeStringGetenv -- возвращает новую потокобезопасную строку из окружения.
-func NewSafeStringGetenv(env defs.ITxtFix) mL0.IResult[mKs.ISafeString] {
+func NewSafeStringGetenv(env defs.ITxtFix) *lev0.Result[mKs.ISafeString] {
 	sf := NewSafeString()
 	res := sf.Getenv(env)
 	if res.IsErr() {
 		err := defs.Err("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err())
-		return mL0.NewErr[mKs.ISafeString](err)
+		return lev0.NewErr[mKs.ISafeString](err)
 	}
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // Byte -- возвращает байтовое представление строки.
@@ -62,12 +62,12 @@ func (sf *safeString) Reset() {
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeString) Getenv(env defs.ITxtFix) mL0.IResult[defs.ITxtFix] {
+func (sf *safeString) Getenv(env defs.ITxtFix) *lev0.Result[defs.ITxtFix] {
 	txtVal := defs.ATxt(os.Getenv(env.String()))
 	if txtVal == "" {
 		err := defs.Err("safeString.Getenv(): from env(%v), val is empty", env)
-		return mL0.NewErr[defs.ITxtFix](err)
+		return lev0.NewErr[defs.ITxtFix](err)
 	}
 	sf.val = defs.TxtMut(txtVal)
-	return mL0.NewOk(defs.ITxtFix(sf.val))
+	return lev0.NewOk(defs.ITxtFix(sf.val))
 }

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

@@ -4,7 +4,7 @@ package kchan
 import (
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"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/lev0/helpers"
@@ -68,17 +68,17 @@ func NewKChan[T any](param *KChanParam[T]) core_spec.IChan[T] {
 }
 
 // Read -- возвращает первый элемент очереди (если есть).
-func (sf *KChan[T]) Read() core_spec.IResult[T] {
+func (sf *KChan[T]) Read() *lev0.Result[T] {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if len(sf.lstMsg) == 0 {
 		err := defs.Err("KChan[T].Read(): empty list msg")
-		return mL0.NewErr[T](err)
+		return lev0.NewErr[T](err)
 	}
 
 	msg := sf.lstMsg[0]
 	sf.lstMsg = sf.lstMsg[1:]
-	return mL0.NewOk(msg)
+	return lev0.NewOk(msg)
 }
 
 // Limit -- ограничение размера канала.

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

@@ -4,7 +4,7 @@ package kmodule
 import (
 	"time"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"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/lev0/etypes/ebool"
@@ -98,7 +98,7 @@ func (sf *kModule) sigLive() {
 	var (
 		topic  = bus_ent.ITopicFix(topic.NewTopic(bus_ent.ATopic(sf.name.Get()) + "_live"))
 		iPhase = 0
-		res    mL0.IResult[core_spec.EBool]
+		res    *lev0.Result[core_spec.EBool]
 	)
 	fnPhase := func() {
 		time.Sleep(time.Millisecond * time.Duration(sf.timePhase.Get()))

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

@@ -7,7 +7,7 @@ import (
 	"sync"
 	"time"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
@@ -31,11 +31,11 @@ var (
 )
 
 // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке.
-func GetKservHttpStd() mL0.IResult[*kServHttpStd] {
+func GetKservHttpStd() *lev0.Result[*kServHttpStd] {
 	mu.Lock()
 	defer mu.Unlock()
 	if kServ != nil {
-		return mL0.NewOk(kServ)
+		return lev0.NewOk(kServ)
 	}
 	logBufParam := &log_buf.LogBufParam{
 		IsTerm_: safe_bool.NewSafeBool(true),
@@ -51,7 +51,7 @@ func GetKservHttpStd() mL0.IResult[*kServHttpStd] {
 		port: resPort.Ok().Get(),
 	}
 	kServ = sf
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // Run -- запускает сервер вы работу.

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

@@ -2,7 +2,7 @@
 package log_topic
 
 import (
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
@@ -17,25 +17,25 @@ type LogTopic struct {
 }
 
 // NewLogTopic -- возвращает новый элемент лога.
-func NewLogTopic(topic topic.ITopicFix, client bus_spec.IBusClient) mL0.IResult[*LogTopic] {
+func NewLogTopic(topic topic.ITopicFix, client bus_spec.IBusClient) *lev0.Result[*LogTopic] {
 	helpers.If(topic == nil).Hassert("NewLogTopic(): topic==nil", []any{})
 	if client == nil {
 		err := defs.Err("NewLogTopic(): IBusClient==nil")
-		return mL0.NewErr[*LogTopic](err)
+		return lev0.NewErr[*LogTopic](err)
 	}
 	sf := &LogTopic{
 		topic:  topic,
 		client: client,
 	}
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // Pub -- публикует сообщение в топик.
-func (sf *LogTopic) Pub(binMsg []byte) mL0.IResult[mKs.EBool] {
+func (sf *LogTopic) Pub(binMsg []byte) *lev0.Result[mKs.EBool] {
 	res := sf.client.Publish(sf.topic, binMsg)
 	if res.IsErr() {
 		err := defs.Err("LogTopic.Pub(): in pub with client, err=\n\t%w", res.Err())
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
 	return res
 }

+ 13 - 13
v4/lev2/lsi/kstore_kv/kstore_kv.go

@@ -8,7 +8,7 @@ import (
 
 	"github.com/dgraph-io/badger/v4"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"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/lev0/etypes/ebool"
@@ -79,7 +79,7 @@ func (sf *kStoreKv) Log() comp_spec.ILogBuf {
 }
 
 // Set -- устанавливает значение по ключу.
-func (sf *kStoreKv) Set(rec store_ent.IRecKvFix) mL0.IResult[core_spec.EBool] {
+func (sf *kStoreKv) Set(rec store_ent.IRecKvFix) *lev0.Result[core_spec.EBool] {
 	sf.Lock()
 	defer sf.Unlock()
 	key := rec.Key()
@@ -92,13 +92,13 @@ func (sf *kStoreKv) Set(rec store_ent.IRecKvFix) mL0.IResult[core_spec.EBool] {
 	if err != nil {
 		err := defs.Err("Set(): key=%v, err=\n\t%w", key, err)
 		sf.log.Err(err)
-		return mL0.NewErr[core_spec.EBool](err)
+		return lev0.NewErr[core_spec.EBool](err)
 	}
-	return mL0.NewOk(ebool.NewEBool(true))
+	return lev0.NewOk(ebool.NewEBool(true))
 }
 
 // Get -- возвращает значение по ключу.
-func (sf *kStoreKv) Get(key store_ent.IStoreKeyFix) mL0.IResult[[]byte] {
+func (sf *kStoreKv) Get(key store_ent.IStoreKeyFix) *lev0.Result[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
 	sf.log.Debug(defs.TxtFix("Get(): key='%v'", key))
@@ -115,13 +115,13 @@ func (sf *kStoreKv) Get(key store_ent.IStoreKeyFix) mL0.IResult[[]byte] {
 	if err != nil {
 		err := defs.Err("Get(): key=%v, err=\n\t%v", key, err)
 		sf.log.Err(err)
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
-	return mL0.NewOk(binVal)
+	return lev0.NewOk(binVal)
 }
 
 // ByPrefix -- фильтрует ключи по префиксу.
-func (sf *kStoreKv) ByPrefix(prefix store_ent.IStoreKeyFix) core_spec.IResult[[]store_ent.AStoreKey] {
+func (sf *kStoreKv) ByPrefix(prefix store_ent.IStoreKeyFix) *lev0.Result[[]store_ent.AStoreKey] {
 	var (
 		binKey []byte
 		lstKey = []store_ent.AStoreKey{}
@@ -148,13 +148,13 @@ func (sf *kStoreKv) ByPrefix(prefix store_ent.IStoreKeyFix) core_spec.IResult[[]
 	err := sf.db.View(fnPrefix)
 	if err != nil {
 		err := defs.Err("ByPrefix(): in find, err=\n\t%w", err)
-		return mL0.NewErr[[]store_ent.AStoreKey](err)
+		return lev0.NewErr[[]store_ent.AStoreKey](err)
 	}
-	return mL0.NewOk(lstKey)
+	return lev0.NewOk(lstKey)
 }
 
 // Delete -- удалить ключ из хранилища.
-func (sf *kStoreKv) Delete(key store_ent.IStoreKeyFix) mL0.IResult[core_spec.EBool] {
+func (sf *kStoreKv) Delete(key store_ent.IStoreKeyFix) *lev0.Result[core_spec.EBool] {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug(defs.TxtFix("Delete(): key='%v'", key))
@@ -166,9 +166,9 @@ func (sf *kStoreKv) Delete(key store_ent.IStoreKeyFix) mL0.IResult[core_spec.EBo
 	if err != nil {
 		err := defs.Err("Delete(): key=%v, err=\n\t%w", key, err)
 		sf.log.Err(err)
-		return mL0.NewErr[core_spec.EBool](err)
+		return lev0.NewErr[core_spec.EBool](err)
 	}
-	return mL0.NewOk(ebool.NewEBool(true))
+	return lev0.NewOk(ebool.NewEBool(true))
 }
 
 // Открывает базу при создании.

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

@@ -4,7 +4,7 @@ package dict_rec
 import (
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"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/lev0/etypes/ebool"
@@ -15,9 +15,9 @@ import (
 // IDictRec -- интерфейс потокобезопасного словаря KV-бакета.
 type IDictRec interface {
 	// Get -- возвращает значение по ключу
-	Get(key rec_key.IRecKeyFix) core_spec.IOption[rec_kv.IRecKvFix]
+	Get(key rec_key.IRecKeyFix) lev0.IOption[rec_kv.IRecKvFix]
 	// Set -- устанавливает значение по ключу
-	Set(val rec_kv.IRecKvFix) core_spec.IResult[core_spec.EBool]
+	Set(val rec_kv.IRecKvFix) *lev0.Result[core_spec.EBool]
 	// Del -- удаляет значение по ключу
 	Del(key rec_key.IRecKeyFix)
 	// Len -- возвращает количество записей
@@ -40,26 +40,26 @@ func NewDictRec() *DictRec {
 }
 
 // Get -- получение значения по ключу.
-func (sf *DictRec) Get(key rec_key.IRecKeyFix) mL0.IOption[rec_kv.IRecKvFix] {
+func (sf *DictRec) Get(key rec_key.IRecKeyFix) lev0.IOption[rec_kv.IRecKvFix] {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
 	rec, isOk := sf.dict[key.Get()]
 	if !isOk {
-		return mL0.NewNone[rec_kv.IRecKvFix]()
+		return lev0.NewNone[rec_kv.IRecKvFix]()
 	}
-	return mL0.NewSome(rec)
+	return lev0.NewSome(rec)
 }
 
 // Set -- установка значения по ключу.
-func (sf *DictRec) Set(rec rec_kv.IRecKvFix) mL0.IResult[core_spec.EBool] {
+func (sf *DictRec) Set(rec rec_kv.IRecKvFix) *lev0.Result[core_spec.EBool] {
 	if rec == nil {
 		err := defs.Err("DictRec.Set(): rec is nil")
-		return mL0.NewErr[core_spec.EBool](err)
+		return lev0.NewErr[core_spec.EBool](err)
 	}
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	sf.dict[rec.Key().Get()] = rec
-	return mL0.NewOk(ebool.NewEBool(true))
+	return lev0.NewOk(ebool.NewEBool(true))
 }
 
 // Del -- удаление значения по ключу.

+ 5 - 4
v4/lev2/lsi/store_spec/ikernel_store_kv.go

@@ -1,6 +1,7 @@
 package store_spec
 
 import (
+		"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent"
@@ -9,13 +10,13 @@ import (
 // IKernelStoreKv -- интерфейс к локальному быстрому key-value хранилищу ядра.
 type IKernelStoreKv interface {
 	// Get -- возвращает значение по ключу
-	Get(key store_ent.IStoreKeyFix) core_spec.IResult[[]byte]
+	Get(key store_ent.IStoreKeyFix) *lev0.Result[[]byte]
 	// ByPrefix -- возвращает список ключей по префиксу
-	ByPrefix(prefix store_ent.IStoreKeyFix) core_spec.IResult[[]store_ent.AStoreKey]
+	ByPrefix(prefix store_ent.IStoreKeyFix) *lev0.Result[[]store_ent.AStoreKey]
 	// Set -- устанавливает значение по ключу
-	Set(rec store_ent.IRecKvFix) core_spec.IResult[core_spec.EBool]
+	Set(rec store_ent.IRecKvFix) *lev0.Result[core_spec.EBool]
 	// Delete -- удаляет значение по ключу
-	Delete(key store_ent.IStoreKeyFix) core_spec.IResult[core_spec.EBool]
+	Delete(key store_ent.IStoreKeyFix) *lev0.Result[core_spec.EBool]
 	// Log -- возвращает локальный лог
 	Log() comp_spec.ILogBuf
 }

+ 4 - 4
v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go

@@ -4,7 +4,7 @@ package mock_hand_serve
 import (
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
@@ -36,15 +36,15 @@ func NewMockHandlerServe(topic bus_ent.ITopicFix, name bus_ent.AHandlerName) *Mo
 }
 
 // Функция обратного вызова подписки.
-func (sf *MockHandlerServe) FnBack(binMsg []byte) mL0.IResult[[]byte] {
+func (sf *MockHandlerServe) FnBack(binMsg []byte) *lev0.Result[[]byte] {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if sf.IsBad_.Get() {
 		err := defs.Err("FnBack(): isBad==true")
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
 	sf.Msg_ = binMsg
-	return mL0.NewOk(binMsg)
+	return lev0.NewOk(binMsg)
 }
 
 // Возвращает уникальное имя обработчика подписки.

+ 2 - 2
v4/lev2/lti/bus_spec/ibus_handler_serve.go

@@ -1,12 +1,12 @@
 package bus_spec
 
 import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 )
 
 // IBusHandlerServe -- обработчик входящих запросов.
 type IBusHandlerServe interface {
 	IBusBaseHandler
 	// FnBack -- функция обратного вызова
-	FnBack(binReq []byte) core_spec.IResult[[]byte]
+	FnBack(binReq []byte) *lev0.Result[[]byte]
 }

+ 3 - 2
v4/lev2/lti/bus_spec/idict_topic.go

@@ -1,6 +1,7 @@
 package bus_spec
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 )
@@ -33,9 +34,9 @@ type IDictTopicSub interface {
 // Но обработчик вызывается конкурентно.
 type IDictTopicServe interface {
 	// Register -- регистрирует единственный обработчик на единственный топик
-	Register(IBusHandlerServe) core_spec.IResult[core_spec.EBool]
+	Register(IBusHandlerServe) *lev0.Result[core_spec.EBool]
 	// SendRequest -- выполняет запрос по указанному топику
-	SendRequest(topic bus_ent.ITopicFix, binReq []byte) core_spec.IResult[[]byte]
+	SendRequest(topic bus_ent.ITopicFix, binReq []byte) *lev0.Result[[]byte]
 	// Unregister -- удаляет единственный обработчик с единственного топика
 	Unregister(IBusHandlerServe)
 }

+ 5 - 5
v4/lev2/lti/bus_spec/ikernel_bus.go

@@ -2,8 +2,8 @@
 package bus_spec
 
 import (
+		"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 )
@@ -14,16 +14,16 @@ import (
 //	Подписка и обслуживание входящих запросов требует _обработчиков_.
 type IKernelBus interface {
 	// Publish -- публикует сообщение в шину
-	Publish(topic bus_ent.ITopicFix, binMsg []byte) def_spec.IResult[core_spec.EBool]
+	Publish(topic bus_ent.ITopicFix, binMsg []byte) *lev0.Result[core_spec.EBool]
 	// SendRequest -- выполняет запрос по указанному топику
-	SendRequest(topic bus_ent.ITopicFix, binReq []byte) def_spec.IResult[[]byte]
+	SendRequest(topic bus_ent.ITopicFix, binReq []byte) *lev0.Result[[]byte]
 
 	// Subscribe -- подписывает обработчик на топик
-	Subscribe(IBusHandlerSubscribe) def_spec.IResult[core_spec.EBool]
+	Subscribe(IBusHandlerSubscribe) *lev0.Result[core_spec.EBool]
 	// Unsubscribe -- отписывается от топика
 	Unsubscribe(IBusHandlerSubscribe)
 	// RegisterServe -- Регистрирует обработчик на обслуживание входящих запросов
-	RegisterServe(IBusHandlerServe) def_spec.IResult[core_spec.EBool]
+	RegisterServe(IBusHandlerServe) *lev0.Result[core_spec.EBool]
 
 	// IsWork -- возвращает признак работы шины
 	IsWork() core_spec.EBool

+ 9 - 9
v4/lev2/lti/kbus/dict_topic_serve/dict_topic_serve.go

@@ -6,7 +6,7 @@ import (
 	"sync"
 	"time"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"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/lev0/etypes/ebool"
@@ -35,20 +35,20 @@ func NewDictServe() *dictServe {
 }
 
 // Register -- регистрирует обработчик запросов.
-func (sf *dictServe) Register(handler bus_spec.IBusHandlerServe) mL0.IResult[core_spec.EBool] {
+func (sf *dictServe) Register(handler bus_spec.IBusHandlerServe) *lev0.Result[core_spec.EBool] {
 	sf.Lock()
 	defer sf.Unlock()
 	if handler == nil {
 		err := defs.Err("dictServe.Register(): IBusHandlerSubscribe==nil")
-		return mL0.NewErr[core_spec.EBool](err)
+		return lev0.NewErr[core_spec.EBool](err)
 	}
 	topic := handler.Topic()
 	isTwinRegister := sf.register(handler)
 	if isTwinRegister {
 		err := defs.Err("dictServe.Register(): handler of topic (%v) already register", topic.Get())
-		return mL0.NewErr[core_spec.EBool](err)
+		return lev0.NewErr[core_spec.EBool](err)
 	}
-	return mL0.NewOk(ebool.NewEBool(true))
+	return lev0.NewOk(ebool.NewEBool(true))
 }
 
 // Unregister -- удаляет обработчик запросов из словаря.
@@ -64,16 +64,16 @@ func (sf *dictServe) Unregister(handler bus_spec.IBusHandlerServe) {
 }
 
 // SendRequest -- вызывает обработчик при поступлении запроса.
-func (sf *dictServe) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IResult[[]byte] {
+func (sf *dictServe) SendRequest(topic bus_ent.ITopicFix, binReq []byte) *lev0.Result[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
 	handler, isOk := sf.dictServe[topic.Get()]
 	if !isOk {
 		err := defs.Err("dictServe.SendRequest(): handler for topic (%v) not exists", topic.Get())
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
 	var (
-		chRes = make(chan mL0.IResult[[]byte], 2)
+		chRes = make(chan *lev0.Result[[]byte], 2)
 	)
 	ctx, fnCancel := context.WithTimeout(sf.kCtx.Ctx(), time.Millisecond*time.Duration(TimeoutDefault))
 	defer fnCancel()
@@ -86,7 +86,7 @@ func (sf *dictServe) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IRe
 	select {
 	case <-ctx.Done():
 		err := defs.Err("dictServe.SendRequest(): in call for topic (%v), err=\n\t%w", topic.Get(), ctx.Err())
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	case res := <-chRes:
 		return res
 	}

+ 13 - 14
v4/lev2/lti/kbus_base/kbus_base.go

@@ -4,10 +4,9 @@ package kbus_base
 import (
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"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/lev0/defs/def_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
@@ -87,38 +86,38 @@ func (sf *KBusBase) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 }
 
 // Subscribe -- подписывает обработчик на топик.
-func (sf *KBusBase) Subscribe(handler bus_spec.IBusHandlerSubscribe) def_spec.IResult[core_spec.EBool] {
+func (sf *KBusBase) Subscribe(handler bus_spec.IBusHandlerSubscribe) *lev0.Result[core_spec.EBool] {
 	msg := defs.TxtFix("KBusBase.Subscribe(): handler='%v'",
 		handler.Name())
 	sf.log.Debug(msg)
 	helpers.If(!sf.IsWork_.Get()).Hassert("KBusBase.Subscribe():  handler='%v', bus already closed", []any{handler.Name()})
 	sf.dictSub.Subscribe(handler)
-	return mL0.NewOk(ebool.NewEBool(true))
+	return lev0.NewOk(ebool.NewEBool(true))
 }
 
 // SendRequest -- отправляет запрос в шину данных.
-func (sf *KBusBase) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IResult[[]byte] {
+func (sf *KBusBase) SendRequest(topic bus_ent.ITopicFix, binReq []byte) *lev0.Result[[]byte] {
 	msg := defs.TxtFix("KBusBase.SendRequest(): topic='%v'", topic.Get())
 	sf.log.Debug(msg)
 	if !sf.IsWork_.Get() {
 		err := defs.Err("KBusBase.SendRequest():  topic='%v', bus already closed", topic.Get())
 		sf.log.Err(err)
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
 	res := sf.dictServe.SendRequest(topic, binReq)
 	if res.IsErr() {
 		err := defs.Err("KBusBase.SendRequest(): topic='%v', err=\n\t%w", topic.Get(), res.Err())
 		sf.log.Err(err)
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
 	return res
 }
 
 // RegisterServe -- регистрирует обработчики входящих запросов.
-func (sf *KBusBase) RegisterServe(handler bus_spec.IBusHandlerServe) mL0.IResult[core_spec.EBool] {
+func (sf *KBusBase) RegisterServe(handler bus_spec.IBusHandlerServe) *lev0.Result[core_spec.EBool] {
 	if handler == nil {
 		err := defs.Err("KBusBase.RegisterServe(): IBusHandlerServe==nil")
-		return mL0.NewErr[core_spec.EBool](err)
+		return lev0.NewErr[core_spec.EBool](err)
 	}
 	msg := defs.TxtFix("KBusBase.RegisterServe(): handler='%v'", handler.Name())
 	sf.log.Debug(msg)
@@ -126,23 +125,23 @@ func (sf *KBusBase) RegisterServe(handler bus_spec.IBusHandlerServe) mL0.IResult
 	if res.IsErr() {
 		err := defs.Err("KBusBase.RegisterServe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
 		sf.log.Err(err)
-		return mL0.NewErr[core_spec.EBool](err)
+		return lev0.NewErr[core_spec.EBool](err)
 	}
-	return mL0.NewOk(ebool.NewEBool(true))
+	return lev0.NewOk(ebool.NewEBool(true))
 }
 
 // Publish -- публикует сообщение в шину.
-func (sf *KBusBase) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IResult[core_spec.EBool] {
+func (sf *KBusBase) Publish(topic bus_ent.ITopicFix, binMsg []byte) *lev0.Result[core_spec.EBool] {
 	msg := defs.TxtFix("KBusBase.Publish(): topic='%v'", topic)
 	sf.log.Debug(msg)
 	if !sf.IsWork_.Get() {
 		err := defs.Err("KBusBase.Publish(): topic='%v',bus already closed", topic)
 		sf.log.Err(err)
-		return mL0.NewErr[core_spec.EBool](err)
+		return lev0.NewErr[core_spec.EBool](err)
 	}
 	// Асинхронный запуск чтения
 	go sf.dictSub.Read(topic, binMsg)
-	return mL0.NewOk(ebool.NewEBool(true))
+	return lev0.NewOk(ebool.NewEBool(true))
 }
 
 // IsWork -- возвращает признак работы шины.

+ 27 - 28
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go

@@ -9,10 +9,9 @@ import (
 
 	"github.com/google/uuid"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
@@ -104,7 +103,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 }
 
 // Subscribe -- подписывается на топик в дистанционной шине.
-func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) def_spec.IResult[mKs.EBool] {
+func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) *lev0.Result[mKs.EBool] {
 	_uuid, err := uuid.NewV6()
 	helpers.If(err != nil).
 		Hassert("ClientBusHttp.Subscribe(): in generate UUID v6, err=\n\t%v",
@@ -126,28 +125,28 @@ func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) def_sp
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
 		err := defs.Err("ClientBusHttp.Subscribe(): in make POST-request, err=\n\t%w", err)
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
 	resp := &dot.SubscribeResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
 		err := defs.Err("ClientBusHttp.Subscribe(): in unmarshal response, err=\n\t%v", err)
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
 	if resp.Status_.Get() != "ok" {
 		err := defs.Err("ClientBusHttp.Subscribe(): resp!='ok', err=\n\t%v", resp.Status_)
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
 		err := defs.Err("ClientBusHttp.Subscribe(): resp uuid(%v) bad", resp.Uuid_)
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
 	res := sf.bus.Subscribe(handler)
 	return res
 }
 
 // SendRequest -- отправляет в дистанционную шину запрос.
-func (sf *ClientBusHttp) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IResult[[]byte] {
+func (sf *ClientBusHttp) SendRequest(topic bus_ent.ITopicFix, binReq []byte) *lev0.Result[[]byte] {
 	_uuid, err := uuid.NewV6()
 	helpers.If(err != nil).
 		Hassert("ClientBusHttp.SendRequest(): in generate UUID v6, err=\n\t%v",
@@ -169,41 +168,41 @@ func (sf *ClientBusHttp) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
 		err := defs.Err("ClientBusHttp.SendRequest(): in make request, err=\n\t%w", err)
-		return mL0.WrapErr(resBody, err)
+		return lev0.WrapErr(resBody, err)
 	}
 	resp := &dot.ServeResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
 		err := defs.Err("ClientBusHttp.SendRequest(): in unmarshal response, err=\n\t%v", err)
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
 	if resp.Status_.Get() != "ok" {
 		err := defs.Err("ClientBusHttp.SendRequest(): resp!='ok', err=\n\t%v", resp.Status_)
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
 		err := defs.Err("ClientBusHttp.SendRequest(): resp uuid(%v) bad", resp.Uuid_)
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
-	return mL0.NewOk(resp.BinResp_)
+	return lev0.NewOk(resp.BinResp_)
 }
 
 // RegisterServe -- регистрирует в локальной шине обработчик.
-func (sf *ClientBusHttp) RegisterServe(handler bus_spec.IBusHandlerServe) mL0.IResult[mKs.EBool] {
+func (sf *ClientBusHttp) RegisterServe(handler bus_spec.IBusHandlerServe) *lev0.Result[mKs.EBool] {
 	if handler == nil {
 		err := defs.Err("ClientBusHttp.RegisterServe(): handler==nil")
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
 	res := sf.bus.RegisterServe(handler)
 	if res.IsErr() {
 		err := defs.Err("ClientBusHttp.RegisterServe(): in register serve to bus, err=\n\t%v", res.Err())
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
-	return mL0.NewOk(ebool.NewEBool(true))
+	return lev0.NewOk(ebool.NewEBool(true))
 }
 
 // Publish -- публикует сообщение в дистанционной шину.
-func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IResult[mKs.EBool] {
+func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) *lev0.Result[mKs.EBool] {
 	_uuid, err := uuid.NewV6()
 	helpers.If(err != nil).
 		Hassert("ClientBusHttp.Publish(): in generate UUID v6, err=\n\t%v",
@@ -223,32 +222,32 @@ func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IRe
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
 		err := defs.Err("ClientBusHttp.Publish(): in make request, err=\n\t%w", err)
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
 	resp := &dot.PublishResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
 		err := defs.Err("ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
 	if resp.Status_.Get() != "ok" {
 		err := defs.Err("ClientBusHttp.Publish(): resp!='ok', err=\n\t%v", resp.Status_)
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
 		err := defs.Err("ClientBusHttp.Publish(): resp uuid(%v) bad", resp.Uuid_)
-		return mL0.NewErr[mKs.EBool](err)
+		return lev0.NewErr[mKs.EBool](err)
 	}
-	return mL0.NewOk(ebool.NewEBool(true))
+	return lev0.NewOk(ebool.NewEBool(true))
 }
 
 // Единый обработчик запросов.
-func (sf *ClientBusHttp) makePost(hReq *http.Request) def_spec.IResult[[]byte] {
+func (sf *ClientBusHttp) makePost(hReq *http.Request) *lev0.Result[[]byte] {
 	hReq.Header.Add("Content-Type", "application/json")
 	_resp, err := http.DefaultClient.Do(hReq)
 	if err != nil {
 		err := defs.Err("ClientBusHttp.makePost(): after request, err=\n\t%w", err)
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
 	defer func() {
 		_ = _resp.Body.Close()
@@ -256,16 +255,16 @@ func (sf *ClientBusHttp) makePost(hReq *http.Request) def_spec.IResult[[]byte] {
 	if _resp.StatusCode != http.StatusOK {
 		err := defs.Err("ClientBusHttp.makePost(): url=%q, status=%q",
 			hReq.URL, _resp.Status)
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
 
 	binBody, err := io.ReadAll(_resp.Body)
 	if err != nil {
 		err := defs.Err("ClientBusHttp.makePost(): after read body, err=\n\t%v",
 			err)
-		return mL0.NewErr[[]byte](err)
+		return lev0.NewErr[[]byte](err)
 	}
-	return mL0.NewOk(binBody)
+	return lev0.NewOk(binBody)
 }
 
 // Log -- возвращает локальный лог клиента.

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

@@ -2,7 +2,7 @@
 package wui
 
 import (
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_button"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx"
@@ -10,7 +10,7 @@ import (
 )
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
-func NewWuiButton(text defs.ITxtFix, fnClick func(map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix]) mWt.IWuiButton {
+func NewWuiButton(text defs.ITxtFix, fnClick func(map[defs.ATxt]defs.ATxt) *lev0.Result[defs.ITxtFix]) mWt.IWuiButton {
 	wBtn := wui_button.NewWuiButton(text, fnClick)
 	return wBtn
 }

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

@@ -4,7 +4,7 @@ package wui_button
 import (
 	"strings"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx"
@@ -14,17 +14,17 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_widget"
 )
 
+// FnBtnBack -- функция обратного вызова для кнопки.
+type FnBtnBack func(map[defs.ATxt]defs.ATxt) *lev0.Result[defs.ITxtFix]
+
 // WuiButton -- WUI-кнопка.
 type WuiButton struct {
 	mWt.IWuiWidget
 	text   mWt.IWuiText
-	fnBack func(map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix]
+	fnBack FnBtnBack
 	hx     mWt.IWuiHx
 }
 
-// FnBtnBack -- функция обратного вызова для кнопки.
-type FnBtnBack func(map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix]
-
 // NewWuiButton -- возвращает новую WUI-кнопку.
 func NewWuiButton(text defs.ITxtFix, fnBack FnBtnBack) *WuiButton {
 	helpers.If(fnBack == nil).Hassert("NewWuiButton(): text=%q, fnBack==nil", []any{text})
@@ -51,7 +51,7 @@ func (sf *WuiButton) Text() mWt.IWuiText {
 }
 
 // Click -- событие нажатия.
-func (sf *WuiButton) Click(dict map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix] {
+func (sf *WuiButton) Click(dict map[defs.ATxt]defs.ATxt) *lev0.Result[defs.ITxtFix] {
 	return sf.fnBack(dict)
 }
 

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

@@ -3,7 +3,7 @@ package wui_button
 import (
 	"testing"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
 
@@ -43,7 +43,7 @@ func (sf *tester) new() {
 }
 
 // Функция обратного вызова.
-func (sf *tester) fnBack(dict map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix] {
+func (sf *tester) fnBack(dict map[defs.ATxt]defs.ATxt) *lev0.Result[defs.ITxtFix] {
 	sf.chCall <- "test"
-	return mL0.NewOk(defs.TxtFix("test_click"))
+	return lev0.NewOk(defs.TxtFix("test_click"))
 }

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

@@ -4,7 +4,7 @@ package wui_label
 import (
 	"strings"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_text"
@@ -19,7 +19,7 @@ type WuiLabel struct {
 }
 
 // NewWuiLabel -- возвращает новую метку.
-func NewWuiLabel(text defs.ITxtFix) mL0.IResult[*WuiLabel] {
+func NewWuiLabel(text defs.ITxtFix) *lev0.Result[*WuiLabel] {
 	sf := &WuiLabel{
 		IWuiWidget: wui_widget.NewWuiWidget(),
 		text:       wui_text.NewWuiText(text),
@@ -27,7 +27,7 @@ func NewWuiLabel(text defs.ITxtFix) mL0.IResult[*WuiLabel] {
 	wCtx := wui_ctx.GetWuiCtx()
 	wCtx.Set(sf.Id(), sf, "WUI-метка")
 	_ = mWt.IWuiLabel(sf)
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // Text -- возвращает текст метки.

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

@@ -3,7 +3,7 @@ package wui
 import (
 	"testing"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
 
@@ -32,7 +32,7 @@ func (sf *tester) get() {
 }
 
 // Функция обратного вызова.
-func (sf *tester) fnClick(dict map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix] {
+func (sf *tester) fnClick(dict map[defs.ATxt]defs.ATxt) *lev0.Result[defs.ITxtFix] {
 	sf.t.Log("fnClick")
-	return mL0.NewOk(defs.TxtFix("test_click"))
+	return lev0.NewOk(defs.TxtFix("test_click"))
 }

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

@@ -1,7 +1,7 @@
 package wui_types
 
 import (
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
 
@@ -11,7 +11,7 @@ type IWuiButton interface {
 	// Text -- возвращает текст кнопки
 	Text() IWuiText
 	// Click -- нажатие кнопки
-	Click(map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix]
+	Click(map[defs.ATxt]defs.ATxt) *lev0.Result[defs.ITxtFix]
 	// Hx -- атрибуты HTMX
 	Hx() IWuiHx
 }

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

@@ -2,7 +2,7 @@
 package mod_ent
 
 import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/mod_num"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
@@ -28,7 +28,7 @@ func NewModuleNumFix() mod_num.IModNumFix {
 // ModuleNumFromStr -- возвращает номер модуля из строки
 //
 
-func ModuleNumFromStr(str defs.ITxtFix) core_spec.IResult[mod_num.IModNumFix] {
+func ModuleNumFromStr(str defs.ITxtFix) *lev0.Result[mod_num.IModNumFix] {
 	return mod_num.FromStr(str)
 }
 

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

@@ -6,7 +6,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/defs"
 )
 
@@ -42,7 +41,7 @@ func NewModuleNumFix() IModNumFix {
 }
 
 // FromStr -- возвращает новый номер модуля из строки.
-func FromStr(txtNumMod defs.ITxtFix) core_spec.IResult[IModNumFix] {
+func FromStr(txtNumMod defs.ITxtFix) *lev0.Result[IModNumFix] {
 	resNum := txtNumMod.Atoi()
 	if resNum.IsErr() {
 		err := defs.Err("FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", txtNumMod, resNum.Err())

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

@@ -6,7 +6,7 @@ import (
 	"fmt"
 	"strings"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
@@ -42,11 +42,11 @@ var strBlockModules string
 var strBlockRow string
 
 // Событие клика по кнопке.
-func (sf *BtnModules) clickMonolit(dict map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix] {
+func (sf *BtnModules) clickMonolit(dict map[defs.ATxt]defs.ATxt) *lev0.Result[defs.ITxtFix] {
 	optMonolit := sf.kCtx.Get(defs.TxtFix("monolit"))
 	if optMonolit.IsNone() {
 		err := defs.Err("clickMonolit(): monolit module not found")
-		return mL0.NewErr[defs.ITxtFix](err)
+		return lev0.NewErr[defs.ITxtFix](err)
 	}
 	mon := optMonolit.Some().Val().(mod_spec.IKernelMonolit)
 	chLst := mon.Ctx().SortedList()
@@ -72,5 +72,5 @@ func (sf *BtnModules) clickMonolit(dict map[defs.ATxt]defs.ATxt) mL0.IResult[def
 	}
 	strOut = strings.ReplaceAll(strBlockModules, "{.mod_block}", strOut)
 	txtOut := defs.TxtFix(strOut)
-	return mL0.NewOk(txtOut)
+	return lev0.NewOk(txtOut)
 }

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

@@ -4,7 +4,7 @@ package btn_monolit
 import (
 	_ "embed"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui"
 	mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
@@ -31,7 +31,7 @@ func (sf *BtnMonolit) Html() defs.ITxtFix {
 var strBlockMonolit string
 
 // Событие клика по кнопке.
-func (sf *BtnMonolit) clickMonolit(dict map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix] {
+func (sf *BtnMonolit) clickMonolit(dict map[defs.ATxt]defs.ATxt) *lev0.Result[defs.ITxtFix] {
 	txtBlockMonolit := defs.TxtFix(strBlockMonolit)
-	return mL0.NewOk(txtBlockMonolit)
+	return lev0.NewOk(txtBlockMonolit)
 }

+ 4 - 4
v4/lev3/mod_serv_http/http_api/http_api.go

@@ -4,7 +4,7 @@ package http_api
 import (
 	"github.com/gofiber/fiber/v3"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
@@ -15,17 +15,17 @@ import (
 type HttpApi struct{}
 
 // NewHttpApi -- возвращает новое HttpApi.
-func NewHttpApi() mL0.IResult[*HttpApi] {
+func NewHttpApi() *lev0.Result[*HttpApi] {
 	sf := &HttpApi{}
 	kCtx := kctx.GetKernelCtx()
 	optFiber := kCtx.Get(defs.TxtFix("fiberApp"))
 	if optFiber.IsNone() {
 		err := defs.Err("NewHttpApi(): not found fiberApp in kernel ctx")
-		return mL0.NewErr[*HttpApi](err)
+		return lev0.NewErr[*HttpApi](err)
 	}
 	fiberApp := optFiber.Some().Val().(*fiber.App)
 	fiberApp.Post("/api_time", sf.postTime)
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 // Возвращает текущее время сервера.

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

@@ -8,7 +8,7 @@ import (
 
 	"github.com/gofiber/fiber/v3"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"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/lev2/kctx"
@@ -28,15 +28,15 @@ var (
 )
 
 // GetPageModule -- возвращает страницу модуля.
-func GetPageModule() mL0.IResult[*PageModule] {
+func GetPageModule() *lev0.Result[*PageModule] {
 	if page != nil {
-		return mL0.NewOk(page)
+		return lev0.NewOk(page)
 	}
 	kCtx := kctx.GetKernelCtx()
 	optFiber := kCtx.Get(txtFiberApp)
 	if optFiber.IsNone() {
 		err := defs.Err("GetPageModule(): not found fiberApp in kernel ctx")
-		return mL0.NewErr[*PageModule](err)
+		return lev0.NewErr[*PageModule](err)
 	}
 	fiberApp := optFiber.Some().Val().(*fiber.App)
 	kCtx.Set(txtFiberApp, fiberApp, "fiberApp in GetPageModule()")
@@ -51,7 +51,7 @@ func GetPageModule() mL0.IResult[*PageModule] {
 	fiberApp.Post("/module_svg_min/svg_min_:id.svg", sf.postSvgMin)
 	fiberApp.Post("/module_svg_day/svg_day_:id.svg", sf.postSvgDay)
 	page = sf
-	return mL0.NewOk(sf)
+	return lev0.NewOk(sf)
 }
 
 //go:embed log_block.html

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

@@ -10,7 +10,7 @@ import (
 
 	"github.com/gofiber/fiber/v3"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -154,9 +154,9 @@ func (sf *tester) clickGood1() {
 }
 
 // Обратный вызов клика.
-func (sf *tester) fnClick(dict map[defs.ATxt]defs.ATxt) mL0.IResult[defs.ITxtFix] {
+func (sf *tester) fnClick(dict map[defs.ATxt]defs.ATxt) *lev0.Result[defs.ITxtFix] {
 	sf.t.Log("fnClick")
-	return mL0.NewOk(defs.TxtFix("test_click"))
+	return lev0.NewOk(defs.TxtFix("test_click"))
 }
 
 // Неправильный тип объекта.