Coder Social home page Coder Social logo

oscript-fluent's Introduction

fluent

Build Status Quality Gate Maintainability Coverage

Библиотека быстрой обработки коллекций.

Позволяет в "текучем" стиле обрабатывать коллекции - фильтровать, упорядочивать, выполнять операции над элементы, получать результат в виде заданного типа и др.

Возможности

Поддержка строк, массивов, таблиц значений, деревьев значений.

Структуры и соответствия incoming

Конвейерные методы:

  • Первые
  • Пропустить
  • Различные
  • Обработать
  • Развернуть
  • Фильтровать
  • Сортировать
  • СортироватьПо

Терминальные методы:

  • ПолучитьПервый
  • ВМассив
  • ВСтроку
  • Количество
  • ДляКаждого
  • Минимум
  • Максимум
  • Сократить
  • Получить
  • ЛюбойСоответствует
  • ВсеСоответствуют
  • ВсеНеСоответствуют

Функции сравнения, фильтрации, обработки могут задаваться с помощью:

  • Строк библиотека lambdas
  • Действие

Библиотека помимо конструктора класса ПроцессорКоллекций содержит вспомогательный модуль, включающий:

  • построитель процессора коллекций ИзКоллекции()
  • построитель процессора коллекций ИзСтроки()
  • построитель процессора коллекций ИзНабора()
  • СтандартнаяФункцияСравненияПрямойПорядок() - типовой comparator, возвращающий результат сравнения как 1, 0, -1

Примеры работы

Массив = Новый Массив;
Массив.Добавить(3);
Массив.Добавить(4);
Массив.Добавить(7);
Массив.Добавить(5);
Массив.Добавить(1);
Массив.Добавить(0);

Результат = ПроцессорыКоллекций.ИзКоллекции(Массив)
	.Пропустить(1)
	.Фильтровать("Элемент -> Элемент >= 5")
	.Первые(2)
	.Обработать("Элемент -> Элемент + 1")
	.Получить(Тип("Массив"));

// На выходе массив [8, 6]

Тоже самое с помощью Действие:

Функция ОбработчикФильтрации(Элемент) Экспорт
	Возврат Элемент >= 5;
КонецФункции

Функция ОбработчикОбработки(Элемент) Экспорт

	Результат = Элемент + 1;

	Сообщить("Я - операция map, и это мое послание миру: элемент " + Элемент + " превратился в " + Результат);

	Возврат Результат;

КонецФункции

ФункцияФильтрации = Новый Действие(ЭтотОбъект, "ОбработчикФильтрации");
ФункцияОбработки = Новый Действие(ЭтотОбъект, "ОбработчикОбработки");

Результат = ПроцессорыКоллекций.ИзКоллекции(Массив)
	.Пропустить(1)
	.Фильтровать(ФункцияФильтрации)
	.Первые(2)
	.Обработать(ФункцияОбработки)
	.Получить(Тип("Массив"));
Массив = Новый Массив;
Массив.Добавить(4);
Массив.Добавить(2);
Массив.Добавить(2);
Массив.Добавить(3);
Массив.Добавить(3);
Массив.Добавить(3);

ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(Массив);
ПроцессорКоллекций
	.Различные()
	.Сортировать()
	.ДляКаждого("Элемент -> Сообщить(Элемент)");

// На выходе сообщения в консоль:
// 2
// 3
// 4
Строка = 
|строка
|многострочная";

ПроцессорыКоллекций
	.ИзСтроки(Строка, Символы.ПС)
	.Фильтровать("Элемент -> СтрДлина(Элемент) > 1")
	.ДляКаждого("Элемент -> Сообщить(Элемент)");

// На выходе сообщения в консоль:
// многострочная
// строка

Больше примеров работы в каталогах examples и tests.

Публичный интерфейс

Класс ПроцессорКоллекций

Общее API

УстановитьКоллекцию

// Устанавливает коллекцию для обработки Процессора коллекций.
//
// Параметры:
//   НоваяКоллекция - Массив, ТаблицаЗначений, ДеревоЗначений - Коллекция, устанавливаемая в процессор.
//
Процедура УстановитьКоллекцию(НоваяКоллекция) 

Отладка

// Включает возможность отладки. Достигается сохранением текста модуля во временный файл.
//
//  Возвращаемое значение:
//   ПроцессорКоллекций - Ссылка на текущий инстанс ПроцессорКоллекций
//
Функция Отладка(Включена = Истина) 

Конвейерные методы

Первые

// Получить первые N элементов.
// Конвейерный метод.
//
// Параметры:
//   Количество - Число - Число отбираемых элементов.
//
//  Возвращаемое значение:
//   ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
//
Функция Первые(Количество) 

Пропустить

// Пропустить первые N элементов.
// Конвейерный метод.
//
// Параметры:
//   Количество - Число - Число пропускаемых элементов.
//
// Возвращаемое значение:
//   ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
//
Функция Пропустить(Количество) 

Различные

// Выбрать различные элементы.
// Конвейерный метод.
//
// Параметры:
//   ФункцияРавенства - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента,
//    и которая возвращает Булево, Истина если элементы равны, Ложь в противном случае
//                    - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента,
//    и которая возвращает Булево, Истина если элементы равны, Ложь в противном случае
//                    - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияРавенства(),
//    проверка "Элемент1 = Элемент2"
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
//
//  Примеры:
//
//   ПроцессорКоллекций = ПроцессорыКоллекций.ИзНабора(
//       Новый Структура("Имя, Возраст", "Вася", 25),
//       Новый Структура("Имя, Возраст", "Петя", 27),
//       Новый Структура("Имя, Возраст", "Ваня", 25)
//   );
//
//   // 1:
//   ПроцессорКоллекций.Различные("(ЧеловекПервый, ЧеловекВторой) -> ЧеловекПервый.Возраст = ЧеловекВторой.Возраст");
//
//   // В коллекции останутся: Вася(25) и Петя(27)
//
//   // 2:
//   Функция МояФункцияФункцияРавенства(ЭлементПервый, ЭлементВторой) Экспорт
//       Возврат ЧеловекПервый.Возраст = ЧеловекВторой.Возраст;
//   КонецФункции
//
//   ПроцессорКоллекций.Различные(Новый Действие(ЭтотОбъект, "МояФункцияФункцияРавенства"));
//
//   // В коллекции останутся: Вася(25) и Петя(27)
//
Функция Различные(Знач ФункцияРавенства = Неопределено, Знач ДополнительныеПараметры = Неопределено) 

Обработать

// Обработать каждый элемент коллекции.
// Конвейерный метод.
//
// Параметры:
//   ФункцияОбработки - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент,
//    и которая возвращает новый элемент
//                    - Действие - Делегат на функцию с одним параметром в который будет передан элемент,
//    и которая возвращает новый элемент
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
//
//  Примеры:
//		// 1:
//		ПроцессорКоллекций.Обработать("Элемент -> Элемент + 1");
//
//		// 2:
//		Функция МояФункцияОбработки(Элемент) Экспорт
//			Возврат Элемент + 1;
//		КонецФункции
//
//		ФункцияОбработки = Новый Действие(ЭтотОбъект, "МояФункцияОбработки");
//		ПроцессорКоллекций.Обработать(ФункцияОбработки);
//
Функция Обработать(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) 

Развернуть

// Развернуть каждый элемент коллекции в процессор коллекций.
// Позволяет расширить имеющуюся коллекцию.
// Например, разворачивание массива массивов сделает новый массив, содержащий все элементы всех массивов.
// Конвейерный метод.
//
// Параметры:
//   ФункцияРазворачивания - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент,
//    и которая возвращает ПроцессорКоллекций из элемента
//                         - Действие - Делегат на функцию с одним параметром в который будет передан элемент,
//    и которая возвращает ПроцессорКоллекций из элемента
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
// Возвращаемое значение:
//	ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
//
// Примеры:
//	// 1:
//	ПроцессорКоллекций.Развернуть("Элемент -> ПроцессорыКоллекций.ИзСтроки(Элемент)");
//
//	// 2:
//	Функция МояФункцияРазворачивания(Элемент) Экспорт
//		Возврат ПроцессорыКоллекций.ИзСтроки(Элемент);
//	КонецФункции
//	
//	ФункцияРазворачивания = Новый Действие(ЭтотОбъект, "МояФункцияРазворачивания");
//	ПроцессорКоллекций.Развернуть(ФункцияРазворачивания);
//
Функция Развернуть(Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) 

Фильтровать

// Фильтровать коллекцию по условию.
// Конвейерный метод.
//
// Параметры:
//   ФункцияФильтрации - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент,
//    и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае
//                         - Действие - Делегат на функцию с одним параметром в который будет передан элемент,
//    и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
//
//  Примеры:
//		// 1:
//		ПроцессорКоллекций.Фильтровать("Элемент -> СтрДлина(Элемент) > 1");
//
//		// 2:
//		Функция МояФункцияФильтрации(Результат, ДополнительныеПараметры) Экспорт
//			Возврат СтрДлина(ДополнительныеПараметры.Элемент) > 1;
//		КонецФункции
//		
//		ФункцияФильтрации = Новый Действие(ЭтотОбъект, "МояФункцияФильтрации");
//		ПроцессорКоллекций.Фильтровать(ФункцияФильтрации);
//
Функция Фильтровать(Знач ФункцияФильтрации, Знач ДополнительныеПараметры = Неопределено) 

Сортировать

// Сортировать элементы коллекции.
// Конвейерный метод.
//
// Параметры:
//   ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента,
//    и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны
//                    - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента,
//    и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны
//                    - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(),
//    проверка через ">", "<", "="
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
//
//  Примеры:
//		// 1:
//		ПроцессорКоллекций.Сортировать("(Первый, Второй) -> 
//          | Если Первый > Второй Тогда Возврат 1;
//          | ИначеЕсли Второй > Первый Тогда Возврат -1;
//          | Иначе Возврат 0;
//          | КонецЕсли;"
//      );
//
//		// 2:
//		Функция МояФункцияСравнения(Первый, Второй) Экспорт
//          Если Первый > Второй Тогда 
//              Возврат 1;
//          ИначеЕсли Второй > Первый Тогда
//              Возврат -1;
//          Иначе 
//              Возврат 0;
//          КонецЕсли;
//		КонецФункции
//		
//		ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения");
//		ПроцессорКоллекций.Сортировать(ФункцияСравнения);
//
Функция Сортировать(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) 

СортироватьПо

// Сортировать элементы коллекции по выбранному полю.
// Конвейерный метод.
//
// Параметры:
//   ИмяПоля - Строка - Имя поля элемента коллекции, по которому необходимо осуществлять сортировку.
//
//   ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента,
//    и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны
//                    - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента,
//    и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны
//                    - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(),
//    проверка через ">", "<", "="
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций".
//
//  Примеры:
//		// 1:
//		ПроцессорКоллекций.СортироватьПо("НомерСтроки", "(Первый, Второй) -> 
//          | Если Первый > Второй Тогда Возврат 1;
//          | ИначеЕсли Второй > Первый Тогда Возврат -1;
//          | Иначе Возврат 0;
//          | КонецЕсли;"
//      );
//
//		// 2:
//		Функция МояФункцияСравнения(Первый, Второй) Экспорт
//          Если Первый > Второй Тогда 
//              Возврат 1;
//          ИначеЕсли Второй > Первый Тогда
//              Возврат -1;
//          Иначе 
//              Возврат 0;
//          КонецЕсли;
//		КонецФункции
//		
//		ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения");
//		ПроцессорКоллекций.СортироватьПо("НомерСтроки", ФункцияСравнения);
//
Функция СортироватьПо(Знач ИмяПоля, Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) 

Терминальные методы

ПолучитьПервый

// Получить первый элемент.
// Терминальный метод.
//
//  Возвращаемое значение:
//   Произвольный - Первый элемент из коллекции. Если коллекция пуста, возвращает Неопределено.
//
Функция ПолучитьПервый() 

ВМассив

// Получить коллекцию в виде массива.
// Терминальный метод.
//
//  Возвращаемое значение:
//   Массив - Массив элементов коллекции.
//
Функция ВМассив() 

ВСтроку

// Получить коллекцию в виде строки.
// Терминальный метод.
//
// Параметры:
//	РазделительСтрок - Строка - Используемый разделитель между элементами при конкатенации строк.
// 
//  Возвращаемое значение:
//   Строка - Элементы коллекции, соединенные в строку методом конкатенации.
//
Функция ВСтроку(РазделительСтрок = "") 

Количество

// Получить количество элементов коллекции.
// Терминальный метод.
//
//  Возвращаемое значение:
//   Число - Количество элементов коллекции.
//
Функция Количество() 

ДляКаждого

// Обработать каждый элемент коллекции и завершить работу процессора.
// Терминальный метод.
//
// Параметры:
//   ФункцияОбработки - Строка - Лямбда выражение процедура с одним параметром в который будет передан элемент
//                    - Действие - Делегат на процедуру с одним параметром в который будет передан элемент
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Примеры:
//		// 1:
//		ПроцессорКоллекций.ДляКаждого("Элемент -> Сообщить(Элемент);");
//
//		// 2:
//		Процедура МояПроцедураОбработки(Элемент) Экспорт
//			Сообщить(Элемент);
//		КонецПроцедуры
//		
//		ПроцедураОбработки = Новый Действие(ЭтотОбъект, "МояПроцедураОбработки");
//		ПроцессорКоллекций.ДляКаждого(ПроцедураОбработки);
//
Процедура ДляКаждого(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) 

Минимум

// Получить минимальный элемент.
// Терминальный метод.
//
// Параметры:
//   ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента,
//    и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны
//                    - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента,
//    и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны
//                    - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(),
//    проверка через ">", "<", "="
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   Произвольный - минимальный элемент коллекции.
//
//  Примеры:
//		// 1:
//		ПроцессорКоллекций.Минимум();
//
//		// 2:
//		ПроцессорКоллекций.Минимум("(Первый, Второй) -> 
//          | Если Первый > Второй Тогда Возврат 1;
//          | ИначеЕсли Второй > Первый Тогда Возврат -1;
//          | Иначе Возврат 0;
//          | КонецЕсли;"
//      );
//
//		// 3:
//		Функция МояФункцияСравнения(Первый, Второй) Экспорт
//          Если Первый > Второй Тогда 
//              Возврат 1;
//          ИначеЕсли Второй > Первый Тогда
//              Возврат -1;
//          Иначе 
//              Возврат 0;
//          КонецЕсли;
//		КонецФункции
//		
//		ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения");
//		ПроцессорКоллекций.Минимум(ФункцияСравнения);
//
Функция Минимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) 

Максимум

// Получить максимальный элемент.
// Терминальный метод.
//
// Параметры:
//   ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента,
//    и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны
//                    - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента,
//    и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны
//                    - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(),
//    проверка через ">", "<", "="
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   Произвольный - максимальный элемент коллекции.
//
//  Примеры:
//		// 1:
//		ПроцессорКоллекций.Максимум();
//
//		// 2:
//		ПроцессорКоллекций.Максимум("(Первый, Второй) -> 
//          | Если Первый > Второй Тогда Возврат 1;
//          | ИначеЕсли Второй > Первый Тогда Возврат -1;
//          | Иначе Возврат 0;
//          | КонецЕсли;"
//      );
//
//		// 3:
//		Функция МояФункцияСравнения(Первый, Второй) Экспорт
//          Если Первый > Второй Тогда 
//              Возврат 1;
//          ИначеЕсли Второй > Первый Тогда
//              Возврат -1;
//          Иначе 
//              Возврат 0;
//          КонецЕсли;
//		КонецФункции
//		
//		ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения");
//		ПроцессорКоллекций.Максимум(ФункцияСравнения);
//
Функция Максимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) 

Сократить

// Выполнить агрегатную функцию над элементами коллекции.
// Терминальный метод.
//
// Параметры:
//   ФункцияСокращения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы 
//    результат аккумулятор и очередной элемент коллекции, и которая возвращает новое значение результата
//                    - Действие - Делегат на функцию с двумя параметрами в которые будут переданы 
//    результат аккумулятор и очередной элемент коллекции, и которая возвращает новое значение результата
//
//   НачальноеЗначение - Произвольный - начальное значение, передаваемое в функцию сокращения в параметр "Результат"
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   Произвольный - результат работы агрегатной функции.
//
//  Примеры:
//		2:
//		ПроцессорКоллекций.Сократить("Результат, Элемент -> Результат + Элемент", 0);
//
//		2:
//		Функция МояФункцияСокращения(Результат, Элемент) Экспорт
//			Возврат Результат + Элемент;
//		КонецФункции
//		
//		ФункцияСокращения = Новый Действие(ЭтотОбъект, "МояФункцияСокращения");
//		ПроцессорКоллекций.Сократить(ФункцияСокращения);
//
Функция Сократить(Знач ФункцияСокращения, Знач НачальноеЗначение = Неопределено, Знач ДополнительныеПараметры = Неопределено) 

Получить

// Получить коллекцию в виде объекта заданного типа.
// Терминальный метод.
//
// Параметры:
//   ТипРезультата - Тип - Тип, в котором необходимо вернуть коллекцию.
//
//  Возвращаемое значение:
//   Произвольный - Коллекция в виде объекта нужного типа.
//
Функция Получить(ТипРезультата) 

ЛюбойСоответствует

// Проверить, что хотя бы один элемент коллекции удовлетворяет условию в функции сравнения.
// Терминальный метод.
//
// Параметры:
//   ФункцияСравнения - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент,
//    и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае
//                         - Действие - Делегат на функцию с одним параметром в который будет передан элемент,
//    и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   Булево - Истина, если минимум один из элементов коллекции удовлетворяет условию Функции сравнения.
//		В обратном случае возвращает Ложь.
//		Если коллекция пустая, возвращает Ложь.
//
Функция ЛюбойСоответствует(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) 

ВсеСоответствуют

// Проверить, что все элементы коллекции удовлетворяют условию в функции сравнения.
// Терминальный метод.
//
// Параметры:
//   ФункцияСравнения - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент,
//    и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае
//                         - Действие - Делегат на функцию с одним параметром в который будет передан элемент,
//    и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   Булево - Истина, если все элементы коллекции удовлетворяют условию Функции сравнения.
//		В обратном случае возвращает Ложь.
//		Если коллекция пустая, возвращает Истина.
//
Функция ВсеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) 

ВсеНеСоответствуют

// Проверить, что все элементы коллекции не удовлетворяют условию в функции сравнения.
// Терминальный метод.
//
// Параметры:
//   ФункцияСравнения - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент,
//    и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае
//                         - Действие - Делегат на функцию с одним параметром в который будет передан элемент,
//    и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае
//
//   ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, 
//    значения будут доступны по обращению к ключу как к переменной.
//    При передачи действия в первом параметре, этот параметр игнорируется
//                           - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение,
//    в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта.
//    При передачи действия в первом параметре, этот параметр игнорируется
//
//  Возвращаемое значение:
//   Булево - Истина, если все элементы коллекции не удовлетворяют условию Функции сравнения.
//		В обратном случае возвращает Ложь.
//		Если коллекция пустая, возвращает Истина.
//
Функция ВсеНеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) 

Модуль ПроцессорыКоллекций

ИзКоллекции

// Создать ПроцессорКоллекций на основании переданной коллекции.
//
// Параметры:
//   Коллекция - Произвольный - Коллекция (Массив, ТаблицаЗначений...), на основании которой нужно
//		сформировать ПроцессорКоллекций.
//
//  Возвращаемое значение:
//   ПроцессорКоллекций - Инстанс класса ПроцессорКоллекций, заполненный переданной коллекцией.
//
Функция ИзКоллекции(Коллекция) Экспорт

ИзСтроки

// Создать ПроцессорКоллекций на основании переданной строки.
// Переданная строка преобразуется в коллекцию путем разделения строк.
//
// Параметры:
//   Строка - Строка - Строка, на основании которой нужно сформировать ПроцессорКоллекций.
//   РазделительСтрок - Строка - Разделитель строк, применяемый к Строке для получения коллекции.
//		Если не передан, строка разделяется на элементы посимвольно.
//   ВключатьПустые - Булево - Указывает необходимость включать в коллекцию пустые строки,
//		которые могут образоваться в результате разделения исходной строки.
//
//  Возвращаемое значение:
//   ПроцессорКоллекций - Инстанс класса ПроцессорКоллекций.
//
Функция ИзСтроки(Строка, РазделительСтрок = Неопределено, ВключатьПустые = Истина) Экспорт

ИзНабора

// Создать ПроцессорКоллекций на основании переданного набора значений.
// Добавляет элемент в ПроцессорКоллекций, если он не равен NULL.
//
// Параметры:
//	Элемент1 - Произвольный - Элемент для добавления в ПроцессорКоллекций.
//	Элемент2 - Произвольный - Элемент для добавления в ПроцессорКоллекций.
//	Элемент3 - Произвольный - Элемент для добавления в ПроцессорКоллекций.
//	... Всего 32 параметра ...
//
// Возвращаемое значение:
//	ПроцессорКоллекций - Инстанс класса ПроцессорКоллекций, заполненный переданным набором.
//
Функция ИзНабора(Элемент1 = NULL, Элемент2 = NULL, Элемент3 = NULL, ...) Экспорт

СтандартнаяФункцияСравненияПрямойПорядок

// Стандартная функция сравнения.
// Сравнивает значения элементов коллекции через операторы ">", "<" и "=".
//
//  Возвращаемое значение:
//   Действие - Делегат на стандартный метод сравнения
//
Функция СтандартнаяФункцияСравненияПрямойПорядок() 

СтандартнаяФункцияСравненияОбратныйПорядок

// Стандартная функция сравнения в обратном порядке
// Сравнивает значения элементов коллекции через операторы ">", "<" и "=".
//
//  Возвращаемое значение:
//   Действие - Делегат на стандартный метод сравнения в обратном порядке
//
Функция СтандартнаяФункцияСравненияОбратныйПорядок() 

СтандартнаяФункцияРавенства

// Стандартная функция проверки на равенство
// Сравнивает значения элементов коллекции через "=".
//
//  Возвращаемое значение:
//   Действие - Делегат на стандартный метод проверки на равенство
//
Функция СтандартнаяФункцияРавенства() 

Отладка методов

Для того, что бы работал отладчик и заходил в добавленные методы нужно: Либо установить любое значение переменной окружения с именем OSCRIPT_FLUENT_DEBUG. Либо вызвать метод Отладка()


Вдохновение черпалось из java8 stream-api.

oscript-fluent's People

Contributors

240596448 avatar artbear avatar nixel2007 avatar sfaqer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

oscript-fluent's Issues

sortBy

ПроцессорыКоллекций.ИзКоллекции(Таблица).СортироватьПо("ИмяКолонки", НеобязательнаяФункцияСравнения);

При вызове из клиентских скриптов непросто понять, кто виноват в предупреждении о старом синтаксисе лямбда-выражений - предлагается виновника через стек вызовов

выдаются предупреждения вида

Лог.Предупреждение("
		| Использование синтаксиса лямбда выражений без ""->"" а так же описания оповещения является устаревшим
		| и будет удален в последующих версиях, необходимо заменить места использования"
	);

строка-виновник
из класса ‎src/internal/Модули/ПроцессорыКоллекцийСлужебный.os

Пример
image

Решение

  • проверять режим включенности дебаг-лога
  • если он включен, то получать стек-вызова и выдавать его в дебаг-лог
  • стек-вызова вычислять через фейковый блок Попытка-Исключение

Читать шаблон один раз

Упростить код строк-обработчиков и строк-фильтров, избавиться от ДополнительныеПараметры и Результат

@nixel2007 пробую заюзать oscript-fluent в своем коде

написал достаточно простой код

ПроцессорыКоллекций.ИзКоллекции(ИменаМодулей)
.Обработать("Результат = Новый Файл(ОбъединитьПути(ДополнительныеПараметры.ПолноеИмяФайла, ДополнительныеПараметры.ИмяКаталогаСМодулем, Элемент))",
  Новый Структура("ПолноеИмяФайла,  ИмяКаталогаСМодулем",
          Файл.ПолноеИмя, ИмяКаталогаСМодулем))
.Фильтровать("Результат = Элемент.Существует()")
.ДляКаждого("ДополнительныеПараметры.Коллекция.Добавить(Элемент)", Новый Структура("Коллекция", Результат));

вижу сразу кучу неудобств
1 - максимально нечитабельная длиннющая переменная ДополнительныеПараметры
из-за которой текст значительно усложняется

Давай хотя бы уменьшим ее название внутри строк до Параметры

  • можно с сохранением совместимости держать 2 переменные - и новую и старую

2 - вынужденное обращение к переменным из этой структуры в коде удлиняет текст

Предлагаю сделать использование этих переменных внутри кода, чтобы к ним напрямую можно было обращаться внутри строки кода

  • например, .ДляКаждого("Коллекция.Добавить(Элемент)");

сразу отпадет п.1, код будет максимально простым

3 еще предлагаю в методах-условиях вида Фильтровать разрешать пропускать использование Результат =
пытаться вычислить выражение сначала.
если получилось, выдавать его значение как результат.
а вот если не получилось, то уже вычислять, как и сейчас
или просто анализировать наличие "Результат" в коде - если есть, текущий вариант, если нет, вычислять как выражение.

тогда код условий также хорошо упростится и станет более читабельным

что скажешь?

Сортировка по двум значениям сразу

Как повторить? :)

/cc @nixel2007

ТаблицаЗначений = Новый ТаблицаЗначений();
ТаблицаЗначений.Колонки.Добавить("К1");
ТаблицаЗначений.Колонки.Добавить("К2");

Строка1 = ТаблицаЗначений.Добавить();
Строка1.К1 = "8.3.8.1231";
Строка1.К2 = 1;

Строка2 = ТаблицаЗначений.Добавить();
Строка2.К1 = "8.3.13.2031";
Строка2.К2 = 0;

Строка3 = ТаблицаЗначений.Добавить();
Строка3.К1 = "8.3.6.931";
Строка3.К2 = 0;

Строка4 = ТаблицаЗначений.Добавить();
Строка4.К1 = "8.3.14.999";
Строка4.К2 = 1;

ТаблицаЗначений.Сортировать("К1 УБЫВ К2 ВОЗР");

Сообщить(ТаблицаЗначений[0].К1);
Сообщить(ТаблицаЗначений[1].К1);
Сообщить(ТаблицаЗначений[2].К1);
Сообщить(ТаблицаЗначений[3].К1);

Ленивое выполнение конвейерных методов в случае "неполных" терминальных методов

  public Optional<Article> getFirstJavaArticle() {  
    return articles.stream()
        .filter(article -> article.getTags().contains("Java"))
        .findFirst();
    }

Pretty cool right? We first use the filter operation to find all articles that have the Java tag, then used the findFirst() operation to get the first occurrence. Since streams are lazy and filter returns a stream, this approach only processes elements until it finds the first match.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.