Библиотека атомарных типов для OneScript с поддержкой потокобезопасных операций и функциональных интерфейсов.
#Использовать atomic
// Создание атомарных переменных
Число = Новый АтомарноеЧисло(10);
Булево = Новый АтомарноеБулево(Истина);
Ссылка = Новый АтомарнаяСсылка("начальное значение");
// Потокобезопасные операции
Предыдущее = Число.ПолучитьИУстановить(20);
Результат = Число.СравнитьИУстановить(20, 30);Класс для потокобезопасного хранения и изменения числовых значений.
// С начальным значением 0
Число = Новый АтомарноеЧисло();
// С начальным значением
Число = Новый АтомарноеЧисло(42);// Получить текущее значение
Текущее = Число.Получить(); // 42
// Установить новое значение
Число.Установить(100);
// Получить предыдущее и установить новое
Предыдущее = Число.ПолучитьИУстановить(50); // 100
// Атомарное сравнение и обновление
Успех = Число.СравнитьИУстановить(50, 60); // Истина
Успех = Число.СравнитьИУстановить(50, 70); // Ложь// Получить и увеличить на 1
Предыдущее = Число.ПолучитьИИнкрементировать();
// Получить и уменьшить на 1
Предыдущее = Число.ПолучитьИДекрементировать();
// Увеличить на 1 и получить новое
Новое = Число.ИнкрементироватьИПолучить();
// Уменьшить на 1 и получить новое
Новое = Число.ДекрементироватьИПолучить();
// Добавить значение и получить предыдущее
Предыдущее = Число.ПолучитьИДобавить(10);
// Добавить значение и получить новое
Новое = Число.ДобавитьИПолучить(10);// Получить, применить функцию и установить результат
// Возвращает предыдущее значение
Предыдущее = Число.ПолучитьИОбновить("Значение -> Значение * 2");
// С контекстом
Множитель = 3;
Предыдущее = Число.ПолучитьИОбновить(
"Значение -> Значение * Множитель",
Новый Структура("Множитель", Множитель)
);
// С действием
Предыдущее = Число.ПолучитьИОбновить(Новый Действие(ЭтотОбъект, "Умножить"));
// Получить, применить бинарную функцию и установить результат
// Возвращает предыдущее значение
Предыдущее = Число.ПолучитьИСложить(
10,
"(Текущее, Аргумент) -> Текущее + Аргумент"
);
// С контекстом
Коэффициент = 2;
Предыдущее = Число.ПолучитьИСложить(
5,
"(Текущее, Аргумент) -> Текущее + Аргумент * Коэффициент",
Новый Структура("Коэффициент", Коэффициент)
);
// С действием
Предыдущее = Число.ПолучитьИСложить(3, Новый Действие(ЭтотОбъект, "Сложить"));
// Применить функцию и получить результат
// Возвращает новое значение
Новое = Число.ОбновитьИПолучить("Значение -> ВРег(Строка(Значение))");
// Применить бинарную функцию и получить результат
// Возвращает новое значение
Новое = Число.СложитьИПолучить(
5,
"(Текущее, Аргумент) -> Текущее + Аргумент"
);Класс для потокобезопасного хранения и изменения булевых значений.
// С начальным значением Ложь
Булево = Новый АтомарноеБулево();
// С начальным значением
Булево = Новый АтомарноеБулево(Истина);// Получить текущее значение
Текущее = Булево.Получить(); // Истина
// Установить новое значение
Булево.Установить(Ложь);
// Получить предыдущее и установить новое
Предыдущее = Булево.ПолучитьИУстановить(Истина); // Ложь
// Атомарное сравнение и обновление
Успех = Булево.СравнитьИУстановить(Ложь, Истина); // Истина
Успех = Булево.СравнитьИУстановить(Ложь, Истина); // ЛожьКласс для потокобезопасного хранения и изменения значений произвольного типа.
// С начальным значением Неопределено
Ссылка = Новый АтомарнаяСсылка();
// С начальным значением
Ссылка = Новый АтомарнаяСсылка("данные");// Получить текущее значение
Текущее = Ссылка.Получить(); // "данные"
// Установить новое значение
Ссылка.Установить("новые данные");
// Получить предыдущее и установить новое
Предыдущее = Ссылка.ПолучитьИУстановить("ещё данные"); // "новые данные"
// Атомарное сравнение и обновление
Успех = Ссылка.СравнитьИУстановить("ещё данные", "финальные"); // Истина
Успех = Ссылка.СравнитьИУстановить("ещё данные", "финальные"); // Ложь
// Получить, применить функцию и установить результат
// Возвращает предыдущее значение
Предыдущее = Ссылка.ПолучитьИОбновить(
"Значение -> ВРег(Значение)"
); // "финальные"
// С контекстом
Префикс = "PREFIX_";
Предыдущее = Ссылка.ПолучитьИОбновить(
"Значение -> Префикс + Значение",
Новый Структура("Префикс", Префикс)
);
// С действием
Предыдущее = Ссылка.ПолучитьИОбновить(Новый Действие(ЭтотОбъект, "Преобразовать"));
// Получить, применить бинарную функцию и установить результат
// Возвращает предыдущее значение
Предыдущее = Ссылка.ПолучитьИСложить(
10,
"(Текущее, Аргумент) -> Текущее + Строка(Аргумент)"
);
// С контекстом
Сдвиг = "_";
Предыдущее = Ссылка.ПолучитьИСложить(
"b",
"(Текущее, Аргумент) -> Текущее + Аргумент + Сдвиг",
Новый Структура("Сдвиг", Сдвиг)
);
// С действием
Предыдущее = Ссылка.ПолучитьИСложить(2, Новый Действие(ЭтотОбъект, "Прибавить"));
// Применить функцию и получить результат
// Возвращает новое значение
Новое = Ссылка.ОбновитьИПолучить("Значение -> ВРег(Значение)");
// С контекстом
Новое = Ссылка.ОбновитьИПолучить(
"Значение -> Значение + Префикс",
Новый Структура("Префикс", "_")
);
// С действием
Новое = Ссылка.ОбновитьИПолучить(Новый Действие(ЭтотОбъект, "Преобразовать"));
// Применить бинарную функцию и получить результат
// Возвращает новое значение
Новое = Ссылка.СложитьИПолучить(
5,
"(Текущее, Аргумент) -> Текущее + Аргумент"
);
// С контекстом
Новое = Ссылка.СложитьИПолучить(
7,
"(Текущее, Аргумент) -> Текущее + Аргумент + Сдвиг",
Новый Структура("Сдвиг", 1)
);
// С действием
Новое = Ссылка.СложитьИПолучить(10, Новый Действие(ЭтотОбъект, "Сложить"));