Browse Source

SVI Упрощение дженериков под интерфейсы (меньше гемора)

SVI 1 month ago
parent
commit
e96178a5a8
60 changed files with 878 additions and 203 deletions
  1. 10 10
      v4/cmd/demo/main.go
  2. 1 1
      v4/cmd/demo/main_test.go
  3. 105 23
      v4/docs/index.md
  4. 46 0
      v4/lev0/alias/README.md
  5. 4 14
      v4/lev0/alias/alias.go
  6. 0 73
      v4/lev0/alias/atime/atime.go
  7. 0 23
      v4/lev0/alias/atime/atime_test.go
  8. 10 0
      v4/lev0/alias/handler_name/README.md
  9. 44 0
      v4/lev0/alias/handler_name/handler_name_test.go
  10. 10 0
      v4/lev0/alias/module_name/README.md
  11. 42 0
      v4/lev0/alias/module_name/module_name_test.go
  12. 10 0
      v4/lev0/alias/store_key/README.md
  13. 43 0
      v4/lev0/alias/store_key/store_key_test.go
  14. 10 0
      v4/lev0/alias/stream_name/README.md
  15. 10 0
      v4/lev0/alias/topic/README.md
  16. 96 0
      v4/lev0/etypes/estr/estr.go
  17. 46 0
      v4/lev0/etypes/etypes.go
  18. 10 0
      v4/lev0/helpers/README.md
  19. 9 0
      v4/lev0/ktypes/eint.go
  20. 16 0
      v4/lev0/ktypes/estr.go
  21. 5 5
      v4/lev0/ktypes/ibucket_base.go
  22. 10 0
      v4/lev0/ktypes/ibucket_base/README.md
  23. 2 3
      v4/lev0/ktypes/idict_kv.go
  24. 10 0
      v4/lev0/ktypes/idict_kv/README.md
  25. 9 10
      v4/lev0/ktypes/ikernel_bus.go
  26. 11 0
      v4/lev0/ktypes/ikernel_bus/README.md
  27. 11 0
      v4/lev0/ktypes/ikernel_ctx/README.md
  28. 3 5
      v4/lev0/ktypes/ikernel_int.go
  29. 10 0
      v4/lev0/ktypes/ikernel_int/README.md
  30. 11 0
      v4/lev0/ktypes/ikernel_keeper/README.md
  31. 11 0
      v4/lev0/ktypes/ikernel_module/README.md
  32. 1 3
      v4/lev0/ktypes/ikernel_monolit.go
  33. 11 0
      v4/lev0/ktypes/ikernel_monolit/README.md
  34. 11 0
      v4/lev0/ktypes/ikernel_server_http/README.md
  35. 4 6
      v4/lev0/ktypes/ikernel_store_kv.go
  36. 11 0
      v4/lev0/ktypes/ikernel_store_kv/README.md
  37. 1 2
      v4/lev0/ktypes/ikernel_wg.go
  38. 10 0
      v4/lev0/ktypes/ikernel_wg/README.md
  39. 4 8
      v4/lev0/ktypes/ilocal_ctx.go
  40. 11 0
      v4/lev0/ktypes/ilocal_ctx/README.md
  41. 2 3
      v4/lev0/ktypes/ilog_buf.go
  42. 11 0
      v4/lev0/ktypes/ilog_buf/README.md
  43. 11 0
      v4/lev0/ktypes/imodule_stat/README.md
  44. 20 0
      v4/lev0/ktypes/ioption.go
  45. 11 0
      v4/lev0/ktypes/irec_kv/README.md
  46. 2 2
      v4/lev0/ktypes/irec_meta.go
  47. 11 0
      v4/lev0/ktypes/irec_meta/README.md
  48. 11 0
      v4/lev0/ktypes/irec_val/README.md
  49. 23 0
      v4/lev0/ktypes/iresult.go
  50. 10 0
      v4/lev0/ktypes/irw_mutex/README.md
  51. 3 6
      v4/lev0/ktypes/isafe_bool.go
  52. 10 0
      v4/lev0/ktypes/isafe_bool/README.md
  53. 1 3
      v4/lev0/ktypes/isafe_bool_react.go
  54. 11 0
      v4/lev0/ktypes/isafe_bool_react/README.md
  55. 11 0
      v4/lev0/ktypes/isafe_int/README.md
  56. 1 3
      v4/lev0/ktypes/isafe_string.go
  57. 11 0
      v4/lev0/ktypes/isafe_string/README.md
  58. 21 0
      v4/lev0/ktypes/itime.go
  59. 15 0
      v4/lev0/ktypes/itime/README.md
  60. 3 0
      v4/lev0/ktypes/itypes.go

+ 10 - 10
v4/cmd/demo/main.go

@@ -6,22 +6,22 @@ import (
 	kt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
-var app kt.IKernelMonolit
+var app kt.IKernelMonolit // Вынесено для тестов
 
 func main() {
-	app = kern.GetMonolitLocal("Demo monolit").Hassert("main()")
+	app = kern.GetMonolitLocal("Demo monolit")
 
-	modServHttp := kern.GetModuleServHttp().Hassert("main()")
-	app.Add(modServHttp).Hassert("main()")
+	modServHttp := kern.GetModuleServHttp()
+	app.Add(modServHttp)
 
-	modKernelCtx := kern.GetModuleKernelCtx().Hassert("main()")
-	app.Add(modKernelCtx).Hassert("main()")
+	modKernelCtx := kern.GetModuleKernelCtx()
+	app.Add(modKernelCtx)
 
-	modKernKeep := kern.GetModuleKernelKeeper().Hassert("main()")
-	app.Add(modKernKeep).Hassert("main()")
+	modKernKeep := kern.GetModuleKernelKeeper()
+	app.Add(modKernKeep)
 
-	modWui := kern.GetModuleWui().Hassert("main()")
-	app.Add(modWui).Hassert("main()")
+	modWui := kern.GetModuleWui()
+	app.Add(modWui)
 
 	app.Run()
 	app.Wait()

+ 1 - 1
v4/cmd/demo/main_test.go

@@ -16,6 +16,6 @@ func TestMain(t *testing.T) {
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18332/")
 	go main()
 	time.Sleep(time.Second * 2)
-	kCtx := kctx.GetKernelCtx().Hassert("TestMain()")
+	kCtx := kctx.GetKernelCtx()
 	kCtx.Cancel()
 }

+ 105 - 23
v4/docs/index.md

@@ -1,32 +1,114 @@
 # kern -- модульные компоненты
 
-**kern** позволяет строить проекты на модульном принципе. Этот принцип позволяет бесшовно переходить от модульного монолита к модульным микросервисам. Первый подход (монолит) удобен в стартапах. Второй подход удобен, когда понятно, какие части масштабировать.
+**kern** позволяет строить проекты на модульном принципе. Этот принцип позволяет бесшовно переходить от модульного монолита к микросервисам. Первый подход (монолит) удобен в стартапах. Второй подход удобен, когда понятно, какие части масштабировать.
 
-## Состав проекта
+---
 
-### Ядро
+## 🎯 Что это?
 
-- [Алиасы](./alias.md)
-- [Типы (интерфейсы)](./types.md)
-- [Шина](./bus.md)
-- [Контекст ядра](./all_context.md)
-- [Модули](./modules.md)
-- [Монолит](./monolit.md)
-- [Сервер HTTP](./server_http.md)
-- [Хранилище key-value](./stjre_kv.md)
+kern — фреймворк для создания модульных компонентов ядра с высокой надёжностью. Он поддерживает эволюцию от модульного монолита к микросервисной архитектуре без потери производительности или надёжности.
 
-## Компоненты
+### Ключевые принципы
 
-- (Помощники)(./helpers.md)
-- (Локальный контекст)(./local_ctx.md)
-- (Буфер логирования)(./log_buf.md)
-- (Потокобезопасный реактивный `bool`)(./safe_react_bool.md)
-- (Потокобезопасный `int`)(./safe_int.md)
-- (Потокобезопасный `string`)(./safe_string.md)
+- **Модульность** — изолированные компоненты с чёткими границами
+- **Надёжность** — 100% покрытие тестами, strict типизация
+- **Эволюция** — монолит → микросервисы без больших refactors
+- **Документация** — прямые и обратные ссылки между материалами
 
-## Модули
+---
 
-- [Модуль контекста ядра](./module_kern_ctx.md)
-- [Модуль сторожа ядра](./module_kern_keeper.md)
-- [Модуль сервера HTTP](./module_serv_http.md)
-- [Модуль веб-интерфейса](./module_web_interface.md)
+## 📦 Ядро
+
+Базовые компоненты и интерфейсы для построения надёжных микросервисов.
+
+### Состав проекта
+
+- [**Алиасы**](./alias.md) — пользовательские типы для усиления типизации
+- [**Типы (интерфейсы)**](./types.md) — интерфейсы для ослабления зацепления
+- [**Шина**](./bus.md) — реактивная шина сообщений
+- [**Контекст ядра**](./all_context.md) — центральный контекст для компонентов
+- [**Модули**](./modules.md) — структура модульной архитектуры
+- [**Монолит**](./monolit.md) — подход модульного монолита
+- [**Сервер HTTP**](./server_http.md) — встроенный HTTP-сервер
+- [**Хранилище key-value**](./stjre_kv.md) — быстрое хранилище данных
+
+---
+
+## 🧩 Компоненты
+
+Вспомогательные утилиты для работы с контекстом, логированием и типизацией.
+
+- [**Помощники**](./helpers.md) — полезные утилиты
+- [**Локальный контекст**](./local_ctx.md) — контекст на уровне компонента
+- [**Буфер логирования**](./log_buf.md) — реактивный буфер логов
+- [**Потокобезопасный реактивный `bool`**](./safe_react_bool.md) — реактивный буфер
+- [**Потокобезопасный `int`**](./safe_int.md) — реактивный счётчик
+- [**Потокобезопасный `string`**](./safe_string.md) — реактивная строка
+
+---
+
+## 🏗️ Модули
+
+Готовые модульные компоненты с собственной логикой и конфигурацией.
+
+- [**Модуль контекста ядра**](./module_kern_ctx.md) — центральный контекст
+- [**Модуль сторожа ядра**](./module_kern_keeper.md) — сторож компонентов
+- [**Модуль сервера HTTP**](./module_serv_http.md) — HTTP-сервер
+- [**Модуль веб-интерфейса**](./module_web_interface.md) — веб-интерфейс
+
+---
+
+## 🔗 Обратные связи
+
+### Из ядра
+
+- [**Ядро**](#ядро) → [**Компоненты**](#компоненты)
+- [**Ядро**](#ядро) → [**Модули**](#модули)
+
+### Из компонентов
+
+- [**Помощники**](./helpers.md) → [**Ядро**](#ядро)
+
+### Из модулей
+
+- [**Модуль контекста**](./module_kern_ctx.md) → [**Ядро**](#ядро)
+- [**Модуль HTTP**](./module_serv_http.md) → [**Сервер HTTP**](./server_http.md)
+
+---
+
+## 📚 Дополнительные материалы
+
+- [Типы интерфейсов](./types.md) — интерфейсы для ослабления зацепления
+- [IDictTopicServe](./idict_topic_serve.md) — кастомный обработчик входящих запросов
+
+---
+
+## 📖 Навигация
+
+### Быстрый старт
+
+- [Начните здесь →](#кern---модульные-компоненты)
+- [Ядро →](#ядро)
+- [Компоненты →](#компоненты)
+- [Модули →](#модули)
+
+### Для разработчиков
+
+- [Архитектура →](#ядро)
+- [Типизация →](./types.md)
+- [Модульность →](./modules.md)
+
+### Для администраторов
+
+- [Контекст →](./all_context.md)
+- [Логирование →](./log_buf.md)
+- [HTTP сервер →](./server_http.md)
+
+---
+
+## 🔄 Обновления
+
+- **v4** — текущая версия
+- **v3** — предыдущая версия
+
+**[Вернуться наверх ↑](#кern---модульные-компоненты)**

+ 46 - 0
v4/lev0/alias/README.md

@@ -0,0 +1,46 @@
+# alias — Алиасные типы
+
+Алиасные типы служат для усиления типизации в ядре kern, что повышает надёжность в целом.
+
+> **Примечание:** алиас пользовательского типа в `go` является самостоятельным типом и требует приведения к базовому, если это необходимо.
+
+---
+
+## АTime
+
+Метка времени в формате:
+
+```text
+2006-01-02 15:04:05.000 -07 MST
+```
+
+---
+
+## AStreamName
+
+Имя потока ожидания (в потоках ядра)
+
+---
+
+## ATopic
+
+Имя топика в шине ядра
+
+---
+
+## AHandlerName
+
+Имя функции-обработчика в шине ядра
+
+---
+
+## AModuleName
+
+Имя модуля в модульной структуре
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из типов → АTime](/v4/docs/ktypes/itime.md)
+- [Из ядра → АTime](/v4/docs/ktypes/itime.md)

+ 4 - 14
v4/lev0/alias/alias.go

@@ -2,7 +2,6 @@
 package alias
 
 import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/atime"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/handler_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/module_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/store_key"
@@ -10,6 +9,10 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/topic"
 )
 
+// ATime -- метка времени.
+// Вывод: "2006-01-02 15:04:05.000 -07 MST".
+type ATime string
+
 // ABucketName -- имя сущности.
 type ABucketName string
 
@@ -33,19 +36,6 @@ func NewATopic(val string) *ATopic {
 	return topic.NewATopic(val)
 }
 
-// ATime -- метка времени.
-type ATime = atime.ATime
-
-// FnOptAtime -- тп функции опции времени для установки значения.
-type FnOptAtime = atime.FnOptAtime
-
-// NewATime -- создать новую метку времени.
-//
-//go:fix inline
-func NewATime(lstFn ...FnOptAtime) *ATime {
-	return atime.NewATime(lstFn...)
-}
-
 // AHandlerName -- имя функции обработчика.
 type AHandlerName = handler_name.AHandlerName
 

+ 0 - 73
v4/lev0/alias/atime/atime.go

@@ -1,73 +0,0 @@
-package atime
-
-import (
-	"time"
-
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
-)
-
-// ATime -- метка времени.
-// Вывод: "2006-01-02 15:04:05.000 -07 MST".
-type ATime struct {
-	val *quark.QStr[quark.Fix]
-}
-
-// FnOptAtime -- тп функции опции времени для установки значения.
-type FnOptAtime func() string
-
-// OptAtime -- функция для установки значения.
-func OptAtime(val string) FnOptAtime {
-	return func() string {
-		return val
-	}
-}
-
-// NewATime -- создает новый экземпляр ATime.
-func NewATime(lstFn ...FnOptAtime) *ATime {
-	var val string
-	for _, fn := range lstFn {
-		val = fn()
-	}
-	if val == "" {
-		val = time.Now().Local().Format("2006-01-02 15:04:05.000 -07 MST")
-	}
-	qStr := quark.NewQStr(val)
-	return &ATime{
-		val: qStr,
-	}
-}
-
-// String -- возвращает строку.
-//
-//go:fix inline
-func (a *ATime) String() string {
-	return a.val.Val().Get()
-}
-
-// Get -- возвращает строку.
-//
-//go:fix inline
-func (a *ATime) Get() string {
-	return a.val.Val().Get()
-}
-
-// ATimeMut -- метка времени.
-// Вывод: "2006-01-02 15:04:05.000 -07 MST".
-type ATimeMut struct {
-	val *quark.QStr[quark.Mut]
-}
-
-// NewATimeMut -- создает новый экземпляр ATimeMut.
-func NewATimeMut(lstFn ...FnOptAtime) *ATimeMut {
-	var val string
-	for _, fn := range lstFn {
-		val = fn()
-	}
-	if val == "" {
-		val = time.Now().Local().Format("2006-01-02 15:04:05.000 -07 MST")
-	}
-	qStr := quark.NewQStrMut(val)
-	return &ATimeMut{
-		val: qStr,
-	}
-}

+ 0 - 23
v4/lev0/alias/atime/atime_test.go

@@ -1,23 +0,0 @@
-package atime
-
-import (
-	"testing"
-)
-
-type testTime struct {
-	t *testing.T
-}
-
-func TestATime(t *testing.T) {
-	sf := &testTime{
-		t: t,
-	}
-	sf.get()
-}
-
-// Получение времени
-func (t *testTime) get() {
-	a := NewATime()
-	_ = a.String()
-	_ = a.Get()
-}

+ 10 - 0
v4/lev0/alias/handler_name/README.md

@@ -0,0 +1,10 @@
+# handler_name — Имя обработчика
+
+Тип AHandlerName служит для обозначения имени функции-обработчика в шине ядра.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из Алиасов → handler_name](../alias.md#ahandlername)
+- [Из шины ядра → handler_name](/v4/docs/bus.md)

+ 44 - 0
v4/lev0/alias/handler_name/handler_name_test.go

@@ -0,0 +1,44 @@
+package handler_name
+
+import (
+	"testing"
+)
+
+func TestNewAHandlerName_ok(t *testing.T) {
+	t.Parallel()
+
+	cases := []string{
+		"handler",
+		"Handler_1",
+		"имя_обработчика",
+	}
+
+	for _, tc := range cases {
+		t.Run(tc, func(t *testing.T) {
+			t.Parallel()
+
+			hn := NewAHandlerName(tc)
+			if hn == nil {
+				t.Fatalf("NewAHandlerName(): nil")
+			}
+			if got := hn.Get(); got != tc {
+				t.Fatalf("Get(): got=%q want=%q", got, tc)
+			}
+			if got := hn.String(); got != tc {
+				t.Fatalf("String(): got=%q want=%q", got, tc)
+			}
+		})
+	}
+}
+
+func TestNewAHandlerName_empty_panics(t *testing.T) {
+	t.Parallel()
+
+	defer func() {
+		if r := recover(); r == nil {
+			t.Fatalf("expected panic, got nil")
+		}
+	}()
+
+	_ = NewAHandlerName("")
+}

+ 10 - 0
v4/lev0/alias/module_name/README.md

@@ -0,0 +1,10 @@
+# module_name — Имя модуля
+
+Тип AModuleName служит для обозначения имени модуля в модульной структуре.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из Алиасов → module_name](../alias.md#amodulename)
+- [Из модулей → module_name](/v4/docs/modules.md)

+ 42 - 0
v4/lev0/alias/module_name/module_name_test.go

@@ -0,0 +1,42 @@
+package module_name
+
+import "testing"
+
+func TestNewAModuleName_ok(t *testing.T) {
+	t.Parallel()
+
+	cases := []string{
+		"mod",
+		"module_1",
+		"модуль",
+	}
+
+	for _, tc := range cases {
+		t.Run(tc, func(t *testing.T) {
+			t.Parallel()
+
+			mn := NewAModuleName(tc)
+			if mn == nil {
+				t.Fatalf("NewAModuleName(): nil")
+			}
+			if got := mn.Get(); got != tc {
+				t.Fatalf("Get(): got=%q want=%q", got, tc)
+			}
+			if got := mn.String(); got != tc {
+				t.Fatalf("String(): got=%q want=%q", got, tc)
+			}
+		})
+	}
+}
+
+func TestNewAModuleName_empty_panics(t *testing.T) {
+	t.Parallel()
+
+	defer func() {
+		if r := recover(); r == nil {
+			t.Fatalf("expected panic, got nil")
+		}
+	}()
+
+	_ = NewAModuleName("")
+}

+ 10 - 0
v4/lev0/alias/store_key/README.md

@@ -0,0 +1,10 @@
+# store_key — Ключ хранилища
+
+Тип AStoreKey служит для обозначения ключа в хранилище key-value.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из Алиасов → store_key](../alias.md#astorekey)
+- [Из хранилища → store_key](/v4/docs/stjre_kv.md)

+ 43 - 0
v4/lev0/alias/store_key/store_key_test.go

@@ -0,0 +1,43 @@
+package store_key
+
+import "testing"
+
+func TestNewAStoreKey_ok(t *testing.T) {
+	t.Parallel()
+
+	cases := []string{
+		"key",
+		"key_1",
+		"ключ",
+		"topic/partition/offset",
+	}
+
+	for _, tc := range cases {
+		t.Run(tc, func(t *testing.T) {
+			t.Parallel()
+
+			k := NewAStoreKey(tc)
+			if k == nil {
+				t.Fatalf("NewAStoreKey(): nil")
+			}
+			if got := k.Get(); got != tc {
+				t.Fatalf("Get(): got=%q want=%q", got, tc)
+			}
+			if got := k.String(); got != tc {
+				t.Fatalf("String(): got=%q want=%q", got, tc)
+			}
+		})
+	}
+}
+
+func TestNewAStoreKey_empty_panics(t *testing.T) {
+	t.Parallel()
+
+	defer func() {
+		if r := recover(); r == nil {
+			t.Fatalf("expected panic, got nil")
+		}
+	}()
+
+	_ = NewAStoreKey("")
+}

+ 10 - 0
v4/lev0/alias/stream_name/README.md

@@ -0,0 +1,10 @@
+# stream_name — Имя потока
+
+Тип AStreamName служит для обозначения имени потока ожидания в потоках ядра.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из Алиасов → stream_name](../alias.md#astreamname)
+- [Из потоков ядра → stream_name](/v4/docs/bus.md)

+ 10 - 0
v4/lev0/alias/topic/README.md

@@ -0,0 +1,10 @@
+# topic — Имя топика
+
+Тип ATopic служит для обозначения имени топика в шине ядра.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из Алиасов → topic](../alias.md#atopic)
+- [Из шины ядра → topic](/v4/docs/bus.md)

+ 96 - 0
v4/lev0/etypes/estr/estr.go

@@ -0,0 +1,96 @@
+// package estr -- расширенная строка
+package estr
+
+import (
+	mHp "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+)
+
+// EStr -- расширенная строка.
+type EStr struct {
+	val    string // Хранимое значение
+	lenMin int    // Минимальная длина строки
+	lenMax int    // Максимальная длина строки
+	isMut  bool   // Признак мутабельности
+}
+
+// FnOptStr -- опции расширенной строки.
+type FnOptStr func(*EStr)
+
+// OptStrMinLen -- устанавливает минимальную длину строки.
+func OptStrMinLen(lenMin int) FnOptStr {
+	mHp.Hassert(lenMin >= 0,
+		"EStr.OptStrMinLen: минимальная длина строки должна быть больше или равна0")
+	return func(sf *EStr) {
+		sf.lenMin = lenMin
+	}
+}
+
+// OptStrMaxLen -- устанавливает максимальную длину строки.
+func OptStrMaxLen(lenMax int) FnOptStr {
+	return func(sf *EStr) {
+		mHp.Hassert(lenMax >= sf.lenMin,
+			"EStr.OptStrMaxLen: максимальная длина строки должна быть больше или равна0")
+		sf.lenMax = lenMax
+	}
+}
+
+// OptStr -- устанавливает начальное значение строки.
+func OptStr(val string) FnOptStr {
+	return func(sf *EStr) {
+		sf.val = val
+	}
+}
+
+// OptStrMut -- устанавливает признак мутабельности.
+func OptStrMut() FnOptStr {
+	return func(sf *EStr) {
+		sf.isMut = true
+	}
+}
+
+// StrNew -- возвращает новую расширенную строку.
+func StrNew(opt ...FnOptStr) mKt.EStr {
+	sf := &EStr{
+		lenMin: 0,
+		lenMax: 2_000_000_000,
+	}
+	for _, opt := range opt {
+		opt(sf)
+	}
+	sf.SelfCheck()
+	return sf
+}
+
+// StrMutNew -- возвращает новую мутабельную расширенную строку.
+func StrMutNew(opt ...FnOptStr) mKt.EStrMut {
+	sf := &EStr{
+		lenMin: 0,
+		lenMax: 2_000_000_000,
+	}
+	for _, opt := range opt {
+		opt(sf)
+	}
+	sf.SelfCheck()
+	sf.isMut = true
+	return sf
+}
+
+// Set -- устанавливает значение расширенной строки.
+func (sf *EStr) Set(val string) {
+	mHp.Hassert(sf.isMut,
+		"EStrMut.Set(): нельзя изменить значение расширенной строки, если она не мутабельна, val=%q", val)
+	sf.val = val
+	sf.SelfCheck()
+}
+
+// SelfCheck -- самопроверка расширенной строки.
+func (sf *EStr) SelfCheck() {
+	mHp.Hassert(len(sf.val) < sf.lenMin, "EStr.SelfCheck(): строка не может быть %v", sf.lenMin)
+	mHp.Hassert(len(sf.val) > sf.lenMax, "EStr.SelfCheck(): строка не может быть длиннее %v", sf.lenMax)
+}
+
+// Get -- возвращает хранимое значение расширенной строки.
+func (sf *EStr) Get() string {
+	return sf.val
+}

+ 46 - 0
v4/lev0/etypes/etypes.go

@@ -0,0 +1,46 @@
+// package etypes --расширенные типы
+package etypes
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/estr"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+)
+
+// EStr - расширенная строка.
+type EStr = mKt.EStr
+
+// EStrMut - расширенная строка с признаком мутабельности.
+type EStrMut = mKt.EStrMut
+
+// FnOptStr -- опция для установки параметров расширенной строки.
+type FnOptStr = estr.FnOptStr
+
+// OptStrMinLen -- устанавливает минимальную длину строки.
+func OptStrMinLen(lenMin int) FnOptStr {
+	return estr.OptStrMinLen(lenMin)
+}
+
+// OptStrMaxLen -- устанавливает максимальную длину строки.
+func OptStrMaxLen(lenMax int) FnOptStr {
+	return estr.OptStrMaxLen(lenMax)
+}
+
+// OptStr -- устанавливает начальное значение строки.
+func OptStr(val string) FnOptStr {
+	return estr.OptStr(val)
+}
+
+// OptStrMut -- устанавливает признак мутабельности.
+func OptStrMut() FnOptStr {
+	return estr.OptStrMut()
+}
+
+// StrNew -- возвращает новую расширенную строку.
+func StrNew(opt ...FnOptStr) EStr {
+	return estr.StrNew(opt...)
+}
+
+// StrMutNew -- возвращает новую расширенную строку с признаком мутабельности.
+func StrMutNew(opt ...FnOptStr) EStrMut {
+	return estr.StrMutNew(opt...)
+}

+ 10 - 0
v4/lev0/helpers/README.md

@@ -0,0 +1,10 @@
+# helpers — Полезные утилиты
+
+Файл helpers.go содержит набор полезных утилит для работы в рамках ядра kern.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из lev0 → helpers](../README.md#помощники)
+- [Из компонентов → helpers](/v4/docs/index.md#компоненты)

+ 9 - 0
v4/lev0/ktypes/eint.go

@@ -0,0 +1,9 @@
+package ktypes
+
+// EInt -- расширенное целочисленное значение.
+type EInt interface {
+	// SelfCheck -- выполняет самопроверку значения.
+	SelfCheck(err EStr)
+	// Get -- возвращает целочисленное значение.
+	Get() int
+}

+ 16 - 0
v4/lev0/ktypes/estr.go

@@ -0,0 +1,16 @@
+package ktypes
+
+// EStr -- расширенная строка.
+type EStr interface {
+	// SelfCheck -- выполняет самопроверку строки.
+	SelfCheck()
+	// Get -- возвращает строку.
+	Get() string
+}
+
+// EStrMut -- мутабельная расширенная строка.
+type EStrMut interface {
+	EStr
+	// Set -- устанавливает строку.
+	Set(string)
+}

+ 5 - 5
v4/lev0/ktypes/ibucket_base.go

@@ -9,19 +9,19 @@ type IBucketBase interface {
 	// Name -- имя бакета
 	Name() alias.ABucketName
 	// Level -- уровень бакета
-	Level() int
+	Level() EInt
 	// Number -- номер бакета
-	Number() int
+	Number() EInt
 	// Size -- размер бакета
 	Size() int64
 	// SizeLimit -- лимит размера бакета
 	SizeLimit() int64
 	// CreatedAt -- время создания бакета
-	CreatedAt() string
+	CreatedAt() EStr
 	// UpdatedAt -- время обновления бакета
-	UpdatedAt() string
+	UpdatedAt() EStr
 	// Vers -- версия бакета
-	Vers() int
+	Vers() EInt
 	// DictRec -- словарь для хранения данных
 	DictRec() IDictRec
 }

+ 10 - 0
v4/lev0/ktypes/ibucket_base/README.md

@@ -0,0 +1,10 @@
+# ibucket_base — Базовый интерфейс бамкета
+
+IBucketBase служит базовым интерфейсом для бамкетов в хранилище key-value.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ibucket_base](../ktypes.md)
+- [Из хранилища → ibucket_base](/v4/docs/stjre_kv.md)

+ 2 - 3
v4/lev0/ktypes/idict_kv.go

@@ -1,16 +1,15 @@
 package ktypes
 
 import (
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 )
 
 // IDictRec -- интерфейс потокобезопасного словаря KV-бакета.
 type IDictRec interface {
 	// Get -- возвращает значение по ключу
-	Get(key *alias.AStoreKey) *mL0.Option[IRecKv]
+	Get(key *alias.AStoreKey) IOption[IRecKv]
 	// Set -- устанавливает значение по ключу
-	Set(val IRecKv) *mL0.Result[bool]
+	Set(val IRecKv) IResult[bool]
 	// Del -- удаляет значение по ключу
 	Del(key *alias.AStoreKey)
 	// Len -- возвращает количество записей

+ 10 - 0
v4/lev0/ktypes/idict_kv/README.md

@@ -0,0 +1,10 @@
+# idict_kv — Интерфейс key-value
+
+IDictKV служит интерфейсом для работы с хранилищем key-value.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → idict_kv](../ktypes.md)
+- [Из хранилища → idict_kv](/v4/docs/stjre_kv.md)

+ 9 - 10
v4/lev0/ktypes/ikernel_bus.go

@@ -2,7 +2,6 @@ package ktypes
 
 import (
 	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
-	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // IBusBaseHandler -- базовый обработчик обратного вызова.
@@ -24,13 +23,13 @@ type IBusHandlerSubscribe interface {
 type IBusHandlerServe interface {
 	IBusBaseHandler
 	// FnBack -- функция обратного вызова
-	FnBack(binReq []byte) *mRes.Result[[]byte]
+	FnBack(binReq []byte) IResult[[]byte]
 }
 
 // IDictSubHook -- словарь обработчиков по единственному топику.
 type IDictSubHook interface {
 	// Subscribe -- подписывает обработчик
-	Subscribe(IBusHandlerSubscribe) *mRes.Result[bool]
+	Subscribe(IBusHandlerSubscribe)
 	// Read -- все локальные обработчики читают сообщение по его приходу
 	Read(binMsg []byte)
 	// Unsubscribe -- отписывает обработчик
@@ -42,7 +41,7 @@ type IDictSubHook interface {
 //	При подписке потребителей топика может быть НЕСКОЛЬКО на КАЖДЫЙ топик.
 type IDictTopicSub interface {
 	// Subscribe -- подписывает подписчиков на любой из топиков
-	Subscribe(IBusHandlerSubscribe) *mRes.Result[bool]
+	Subscribe(IBusHandlerSubscribe)
 	// Read -- читает сообщение для всех обработчиков подписки по приходу на любой из топиков
 	Read(topic *mKa.ATopic, binMsg []byte)
 	// Unsubscribe -- отписывает подписчиков от любого из топиков
@@ -55,9 +54,9 @@ type IDictTopicSub interface {
 // Но обработчик вызывается конкурентно.
 type IDictTopicServe interface {
 	// Register -- регистрирует единственный обработчик на единственный топик
-	Register(IBusHandlerServe) *mRes.Result[bool]
+	Register(IBusHandlerServe) IResult[bool]
 	// SendRequest -- выполняет запрос по указанному топику
-	SendRequest(topic *mKa.ATopic, binReq []byte) *mRes.Result[[]byte]
+	SendRequest(topic *mKa.ATopic, binReq []byte) IResult[[]byte]
 	// Unregister -- удаляет единственный обработчик с единственного топика
 	Unregister(IBusHandlerServe)
 }
@@ -68,16 +67,16 @@ type IDictTopicServe interface {
 //	Подписка и обслуживание входящих запросов требует _обработчиков_.
 type IKernelBus interface {
 	// Publish -- публикует сообщение в шину
-	Publish(topic *mKa.ATopic, binMsg []byte) *mRes.Result[bool]
+	Publish(topic *mKa.ATopic, binMsg []byte) IResult[bool]
 	// SendRequest -- выполняет запрос по указанному топику
-	SendRequest(topic *mKa.ATopic, binReq []byte) *mRes.Result[[]byte]
+	SendRequest(topic *mKa.ATopic, binReq []byte) IResult[[]byte]
 
 	// Subscribe -- подписывает обработчик на топик
-	Subscribe(IBusHandlerSubscribe) *mRes.Result[bool]
+	Subscribe(IBusHandlerSubscribe) IResult[bool]
 	// Unsubscribe -- отписывается от топика
 	Unsubscribe(IBusHandlerSubscribe)
 	// RegisterServe -- Регистрирует обработчик на обслуживание входящих запросов
-	RegisterServe(IBusHandlerServe) *mRes.Result[bool]
+	RegisterServe(IBusHandlerServe) IResult[bool]
 
 	// IsWork -- возвращает признак работы шины
 	IsWork() bool

+ 11 - 0
v4/lev0/ktypes/ikernel_bus/README.md

@@ -0,0 +1,11 @@
+# ikernel_bus — Шина ядра
+
+IKernelBus служит интерфейсом для шины ядра — реактивной шины сообщений.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ikernel_bus](../ktypes.md)
+- [Из шины → ikernel_bus](/v4/docs/bus.md)
+- [Из ядра → ikernel_bus](/v4/docs/index.md#ядро)

+ 11 - 0
v4/lev0/ktypes/ikernel_ctx/README.md

@@ -0,0 +1,11 @@
+# ikernel_ctx — Контекст ядра
+
+IKernelCtx служит интерфейсом для центрального контекста ядра.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ikernel_ctx](../ktypes.md)
+- [Из контекста → ikernel_ctx](/v4/docs/all_context.md)
+- [Из ядра → ikernel_ctx](/v4/docs/index.md#ядро)

+ 3 - 5
v4/lev0/ktypes/ikernel_int.go

@@ -1,7 +1,5 @@
 package ktypes
 
-import mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
-
 // Int -- целочисленный тип ядра.
 type Int interface {
 	// Get -- возвращает хранимое значение потокобезопасной переменной
@@ -15,11 +13,11 @@ type Int interface {
 	// Dec -- уменьшает число на 1
 	Dec()
 	// FromStr -- устанавливает значение из строки
-	FromStr(string) *mRes.Result[int]
+	FromStr(string) IResult[int]
 	// ToStr -- возвращает как строку
 	ToStr() string
 	// FromByte -- устанавливает значение из байтов
-	FromByte([]byte) *mRes.Result[int]
+	FromByte([]byte) IResult[int]
 	// ToByte -- возвращает как срез байт
 	ToByte() []byte
 	// FromBool -- устанавливает значение из булева
@@ -27,5 +25,5 @@ type Int interface {
 	// ToBool -- возвращает как булево значение
 	ToBool() bool
 	// Getenv -- устанавливает значение из окружения
-	Getenv(string) *mRes.Result[int]
+	Getenv(string) IResult[int]
 }

+ 10 - 0
v4/lev0/ktypes/ikernel_int/README.md

@@ -0,0 +1,10 @@
+# ikernel_int — Счётчик ядра
+
+IKernelInt служит интерфейсом для счётчика в ядре.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ikernel_int](../ktypes.md)
+- [Из ядра → ikernel_int](/v4/docs/index.md#ядро)

+ 11 - 0
v4/lev0/ktypes/ikernel_keeper/README.md

@@ -0,0 +1,11 @@
+# ikernel_keeper — Сторож ядра
+
+IKernelKeeper служит интерфейсом для сторожа компонентов ядра.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ikernel_keeper](../ktypes.md)
+- [Из модуля сторожа → ikernel_keeper](/v4/docs/module_kern_keeper.md)
+- [Из ядра → ikernel_keeper](/v4/docs/index.md#ядро)

+ 11 - 0
v4/lev0/ktypes/ikernel_module/README.md

@@ -0,0 +1,11 @@
+# ikernel_module — Модуль ядра
+
+IKernelModule служит интерфейсом для модуля в модульной структуре.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ikernel_module](../ktypes.md)
+- [Из модулей → ikernel_module](/v4/docs/modules.md)
+- [Из ядра → ikernel_module](/v4/docs/index.md#ядро)

+ 1 - 3
v4/lev0/ktypes/ikernel_monolit.go

@@ -1,7 +1,5 @@
 package ktypes
 
-import mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
-
 // IKernelMonolit -- интерфейс к монолиту на основе ядра.
 type IKernelMonolit interface {
 	// Name -- возвращает имя монолита
@@ -15,7 +13,7 @@ type IKernelMonolit interface {
 	// Wait -- ожидание окончания работы
 	Wait()
 	// Add -- добавляет модуль в монолит
-	Add(IKernelModule) *mRes.Result[bool]
+	Add(IKernelModule)
 	// Log -- возвращает лог монолита
 	Log() ILogBuf
 	// Ctx -- возвращает контекст монолита

+ 11 - 0
v4/lev0/ktypes/ikernel_monolit/README.md

@@ -0,0 +1,11 @@
+# ikernel_monolit — Монолит
+
+IKernelMonolit служит интерфейсом для монолитного подхода.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ikernel_monolit](../ktypes.md)
+- [Из монолита → ikernel_monolit](/v4/docs/monolit.md)
+- [Из ядра → ikernel_monolit](/v4/docs/index.md#ядро)

+ 11 - 0
v4/lev0/ktypes/ikernel_server_http/README.md

@@ -0,0 +1,11 @@
+# ikernel_server_http — HTTP-сервер
+
+IKernelServerHttp служит интерфейсом для HTTP-сервера в ядре.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ikernel_server_http](../ktypes.md)
+- [Из HTTP → ikernel_server_http](/v4/docs/server_http.md)
+- [Из ядра → ikernel_server_http](/v4/docs/index.md#ядро)

+ 4 - 6
v4/lev0/ktypes/ikernel_store_kv.go

@@ -1,17 +1,15 @@
 package ktypes
 
-import mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
-
 // IKernelStoreKv -- интерфейс к локальному быстрому key-value хранилищу ядра.
 type IKernelStoreKv interface {
 	// Get -- возвращает значение по ключу
-	Get(key string) *mRes.Result[[]byte]
+	Get(key string) IResult[[]byte]
 	// ByPrefix -- возвращает список ключей по префиксу
-	ByPrefix(prefix string) *mRes.Result[[]string]
+	ByPrefix(prefix string) IResult[[]string]
 	// Set -- устанавливает значение по ключу
-	Set(key string, val []byte) *mRes.Result[bool]
+	Set(key string, val []byte) IResult[bool]
 	// Delete -- удаляет значение по ключу
-	Delete(key string) *mRes.Result[bool]
+	Delete(key string) IResult[bool]
 	// Log -- возвращает локальный лог
 	Log() ILogBuf
 }

+ 11 - 0
v4/lev0/ktypes/ikernel_store_kv/README.md

@@ -0,0 +1,11 @@
+# ikernel_store_kv — Хранилище
+
+IKernelStoreKv служит интерфейсом для хранилища key-value.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ikernel_store_kv](../ktypes.md)
+- [Из хранилища → ikernel_store_kv](/v4/docs/stjre_kv.md)
+- [Из ядра → ikernel_store_kv](/v4/docs/index.md#ядро)

+ 1 - 2
v4/lev0/ktypes/ikernel_wg.go

@@ -2,13 +2,12 @@ package ktypes
 
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
-	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // IKernelWg -- интерфейс к именованному ожидателю потоков.
 type IKernelWg interface {
 	// Add -- добавляет имя потока в ожидатель потоков
-	Add(*alias.AStreamName) *mRes.Result[bool]
+	Add(*alias.AStreamName)
 	// Done -- удаляет имя потока из ожидания
 	Done(*alias.AStreamName)
 	// Wait -- ожидает завершения работы всех потоков

+ 10 - 0
v4/lev0/ktypes/ikernel_wg/README.md

@@ -0,0 +1,10 @@
+# ikernel_wg — Waiting group
+
+IKernelWg служит интерфейсом для waiting group в ядре.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ikernel_wg](../ktypes.md)
+- [Из ядра → ikernel_wg](/v4/docs/index.md#ядро)

+ 4 - 8
v4/lev0/ktypes/ilocal_ctx.go

@@ -2,10 +2,6 @@ package ktypes
 
 import (
 	"context"
-
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/option"
-	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // ICtxValue -- интерфейс к значению локального контекста.
@@ -16,9 +12,9 @@ type ICtxValue interface {
 	// Val -- возвращает хранимое значение
 	Val() any
 	// CreateAt -- возвращает метку времени создания
-	CreateAt() *mKa.ATime
+	CreateAt() ITime
 	// UpdateAt -- возвращает метку времени обновления
-	UpdateAt() *mKa.ATime
+	UpdateAt() ITimeMut
 	// Comment -- возвращает комментарий значения
 	Comment() string
 }
@@ -27,11 +23,11 @@ type ICtxValue interface {
 type ILocalCtx interface {
 	IRWMutex
 	// Get -- извлекает значение из контекста
-	Get(key string) *option.Option[ICtxValue]
+	Get(key string) IOption[ICtxValue]
 	// Del -- удаляет значение из контекста
 	Del(key string)
 	// Set -- добавляет значение в контекст
-	Set(key string, val any, comment string) *mRes.Result[bool]
+	Set(key string, val any, comment string)
 	// Size -- возвращает размер словаря контекста
 	Size() int
 	// SortedList -- возвращает сортированный список объектов контекста

+ 11 - 0
v4/lev0/ktypes/ilocal_ctx/README.md

@@ -0,0 +1,11 @@
+# ilocal_ctx — Локальный контекст
+
+ILocalCtx служит интерфейсом для локального контекста компонента.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ilocal_ctx](../ktypes.md)
+- [Из контекста → ilocal_ctx](/v4/docs/local_ctx.md)
+- [Из ядра → ilocal_ctx](/v4/docs/index.md#ядро)

+ 2 - 3
v4/lev0/ktypes/ilog_buf.go

@@ -3,13 +3,12 @@ package ktypes
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
-	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // ILogMsg -- сообщение лога.
 type ILogMsg interface {
 	// CreateAt -- когда создано
-	CreateAt() *alias.ATime
+	CreateAt() ITime
 	// Level -- уровень сообщения
 	Level() *quark.QStr[quark.Mut]
 	// Msg -- текст сообщения
@@ -21,7 +20,7 @@ type ILogMsg interface {
 // ILogBus -- публикует в топики логи.
 type ILogBus interface {
 	// DebugAdd -- добавляет топик для отладочного сообщения
-	DebugAdd(topic alias.ATopic, bus IBusClient) *mRes.Result[bool]
+	DebugAdd(topic alias.ATopic, bus IBusClient) IResult[bool]
 }
 
 // ILogBuf -- буферизованный лог для диагностики.

+ 11 - 0
v4/lev0/ktypes/ilog_buf/README.md

@@ -0,0 +1,11 @@
+# ilog_buf — Буфер логирования
+
+ILogBuf служит интерфейсом для буфера логирования.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → ilog_buf](../ktypes.md)
+- [Из логирования → ilog_buf](/v4/docs/log_buf.md)
+- [Из ядра → ilog_buf](/v4/docs/index.md#ядро)

+ 11 - 0
v4/lev0/ktypes/imodule_stat/README.md

@@ -0,0 +1,11 @@
+# imodule_stat — Статистика модуля
+
+IModuleStat служит интерфейсом для статистики модуля.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → imodule_stat](../ktypes.md)
+- [Из модулей → imodule_stat](/v4/docs/modules.md)
+- [Из ядра → imodule_stat](/v4/docs/index.md#ядро)

+ 20 - 0
v4/lev0/ktypes/ioption.go

@@ -0,0 +1,20 @@
+package ktypes
+
+// IOption -- интерфейс опции.
+type IOption[T any] interface {
+	// IsSome - проверяет, есть ли значение.
+	IsSome() bool
+	// IsNone - проверяет, есть ли значение.
+	IsNone() bool
+	// Some - извлекает значение (паника, если None).
+	Some() T
+	// SomeOr - возвращает значение или дефолтное.
+	SomeOr(defaultValue T) T
+	// SomeOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
+	SomeOrFn(fn func() T) T
+	// Hassert -- проверяет, что не пустое значение (с паникой).
+	Hassert(msgFormat string, args ...any) T
+	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
+	Assert(msgFormat string, args ...any) T
+}
+

+ 11 - 0
v4/lev0/ktypes/irec_kv/README.md

@@ -0,0 +1,11 @@
+# irec_kv — Запись key-value
+
+IRecKv служит интерфейсом для записи в хранилище key-value.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → irec_kv](../ktypes.md)
+- [Из хранилища → irec_kv](/v4/docs/stjre_kv.md)
+- [Из ядра → irec_kv](/v4/docs/index.md#ядро)

+ 2 - 2
v4/lev0/ktypes/irec_meta.go

@@ -11,7 +11,7 @@ type IRecMeta interface {
 	// Operation -- тип операции над записью
 	Operation() string
 	// CreatedAt -- дата создания записи
-	CreatedAt() *alias.ATime
+	CreatedAt() ITime
 	// UpdateAt -- дата последнего обновления
-	UpdateAt() *alias.ATime
+	UpdateAt() ITimeMut
 }

+ 11 - 0
v4/lev0/ktypes/irec_meta/README.md

@@ -0,0 +1,11 @@
+# irec_meta — Метазапись
+
+IRecMeta служит интерфейсом для метазаписи в хранилище.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → irec_meta](../ktypes.md)
+- [Из хранилища → irec_meta](/v4/docs/stjre_kv.md)
+- [Из ядра → irec_meta](/v4/docs/index.md#ядро)

+ 11 - 0
v4/lev0/ktypes/irec_val/README.md

@@ -0,0 +1,11 @@
+# irec_val — Значение записи
+
+IRecVal служит интерфейсом для значения записи в хранилище.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → irec_val](../ktypes.md)
+- [Из хранилища → irec_val](/v4/docs/stjre_kv.md)
+- [Из ядра → irec_val](/v4/docs/index.md#ядро)

+ 23 - 0
v4/lev0/ktypes/iresult.go

@@ -0,0 +1,23 @@
+package ktypes
+
+// 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 string, args ...any) T
+	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде).
+	Assert(msgFormat string, args ...any) T
+}

+ 10 - 0
v4/lev0/ktypes/irw_mutex/README.md

@@ -0,0 +1,10 @@
+# irw_mutex — Мьютекс
+
+IRWMutex служит интерфейсом для мьютекса в ядре.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → irw_mutex](../ktypes.md)
+- [Из ядра → irw_mutex](/v4/docs/index.md#ядро)

+ 3 - 6
v4/lev0/ktypes/isafe_bool.go

@@ -1,9 +1,5 @@
 package ktypes
 
-import (
-	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
-)
-
 // ISafeBool -- интерфейс к потокобезопасной переменной.
 type ISafeBool interface {
 	// Get -- возвращает хранимое значение потокобезопасной переменной
@@ -13,7 +9,8 @@ type ISafeBool interface {
 	// Reset -- сбрасывает хранимое потокобезопасное значение
 	Reset()
 	// FromStr -- устанавливает значение из строки
-	FromStr(string) *mRes.Result[bool]
+	FromStr(string) IResult[bool]
 	// Getenv -- устанавливает значение из окружения
-	Getenv(string) *mRes.Result[bool]
+	Getenv(string) IResult[bool]
 }
+

+ 10 - 0
v4/lev0/ktypes/isafe_bool/README.md

@@ -0,0 +1,10 @@
+# isafe_bool — Безопасный bool
+
+ISafeBool служит интерфейсом для потокобезопасного буфера bool.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → isafe_bool](../ktypes.md)
+- [Из ядра → isafe_bool](/v4/docs/index.md#ядро)

+ 1 - 3
v4/lev0/ktypes/isafe_bool_react.go

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

+ 11 - 0
v4/lev0/ktypes/isafe_bool_react/README.md

@@ -0,0 +1,11 @@
+# isafe_bool_react — Реактивный безопасный bool
+
+ISafeBoolReact служит интерфейсом для реактивного буфера bool.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → isafe_bool_react](../ktypes.md)
+- [Из ядра → isafe_bool_react](/v4/docs/index.md#ядро)
+- [Из компонентов → isafe_bool_react](/v4/docs/index.md#компоненты)

+ 11 - 0
v4/lev0/ktypes/isafe_int/README.md

@@ -0,0 +1,11 @@
+# isafe_int — Безопасный int
+
+ISafeInt служит интерфейсом для потокобезопасного счётчика int.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → isafe_int](../ktypes.md)
+- [Из ядра → isafe_int](/v4/docs/index.md#ядро)
+- [Из компонентов → isafe_int](/v4/docs/index.md#компоненты)

+ 1 - 3
v4/lev0/ktypes/isafe_string.go

@@ -1,7 +1,5 @@
 package ktypes
 
-import mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
-
 // ISafeString -- интерфейс к потокобезопасной переменной.
 type ISafeString interface {
 	// Get -- возвращает хранимое значение потокобезопасной переменной
@@ -13,5 +11,5 @@ type ISafeString interface {
 	// Byte -- возвращает байтовое представление строки
 	Byte() []byte
 	// Getenv -- устанавливает строку из переменной окружения
-	Getenv(string) *mRes.Result[string]
+	Getenv(string) IResult[string]
 }

+ 11 - 0
v4/lev0/ktypes/isafe_string/README.md

@@ -0,0 +1,11 @@
+# isafe_string — Безопасная строка
+
+ISafeString служит интерфейсом для потокобезопасной строки.
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → isafe_string](../ktypes.md)
+- [Из ядра → isafe_string](/v4/docs/index.md#ядро)
+- [Из компонентов → isafe_string](/v4/docs/index.md#компоненты)

+ 21 - 0
v4/lev0/ktypes/itime.go

@@ -0,0 +1,21 @@
+package ktypes
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+)
+
+// ITime -- интерфейс времени.
+// Вывод: "2006-01-02 15:04:05.000 -07 MST".
+type ITime interface {
+	// Get -- получить время.
+	Get() alias.ATime
+	// String -- получить строковое представление времени.
+	String() string
+}
+
+// ITimeMut -- интерфейс времени с мутацией.
+type ITimeMut interface {
+	ITime
+	// Set -- установить время.
+	Set(val alias.ATime)
+}

+ 15 - 0
v4/lev0/ktypes/itime/README.md

@@ -0,0 +1,15 @@
+# itime — Метка времени
+
+ITime служит интерфейсом для метки времени в формате:
+
+```text
+2006-01-02 15:04:05.000 -07 MST
+```
+
+---
+
+## 📖 Обратные ссылки
+
+- [Из ktypes → itime](../ktypes.md)
+- [Из ядра → itime](/v4/docs/index.md#ядро)
+- [Из алиасов → itime](../alias.md#atime)

+ 3 - 0
v4/lev0/ktypes/itypes.go

@@ -0,0 +1,3 @@
+// package ktypes -- типы ядра
+package ktypes
+