Библиотека Javascript для написания лаконичного функционального кода. В сочетании с функциями цепочки Java Optional и Promise

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

Эти тонкие дубликаты было трудно идентифицировать, даже если бы мы их нашли, их было бы трудно устранить, применяя абстракцию.

Если бы концепции функционального программирования применялись эффективно путем передачи нескольких выражений или функций, эти тонкие дублирования раскрывались бы сами по себе, и если бы мы могли потратить некоторое время, мы могли бы даже применить некоторые абстракции поверх них для их устранения, и код мог бы казаться компактным.

Эта библиотека поддерживает композицию выражений/функций с одним элементом, промисы через карту, фильтр и плоскую карту.

Функции

  • Лениво оценено
  • Объединение нескольких опций
  • Преобразовать в поток
  • Цепочка синхронизирующих и асинхронных функций/выражений
  • Большинство дополнительных функций Java

Установка

npm install declarative-optional

Импорт

// Common JS
    const {Optional} = require( "declarative-optional");
//ES6
    import  {Optional} from "declarative-optional";

Случаи использования

Увеличить число, которое может быть нулевым или неопределенным

//Increment a Number , which may be null
 Optional.of(input)
    .map(val=>val+1)
    .get()

Все выражения будут оцениваться только после того, как вы укажете get()

Увеличить число на 5, только если оно делится на 5

//Increment a Number by 5, Only if its dividable by 5
Optional.of(input)
    .filter(val=>val % 5 == 0)
    .map(val=>val+5)
    .get()

Для асинхронных функций используйте toAsync(), чтобы собрать результат как обещание‹Необязательно›

Асинхронные варианты использования

Проверка ввода пользователя, подключение к внешней системе и перенаправление на страницу

Императивный код

function getFromUserService({username, password}) {
    return new Promise((function (resolve) {
        resolve({name: "user", isAdmin: true})
    }))
}
async function login({username, password}) {
    if (null == username || null == password) {
        throw new Error("Cannot be Null")
    }
    const result = await getFromUserService(username, password)

    if (result.isAdmin) {
        redirectTo("adminPage")
    } else {
        redirectTo("userPage")
    }
}

С декларативным необязательным

async function login({username, password}) {
    const page = await Optional.of({username: user, password: pass})
        .filter(({username, password}) => (null != username && null != password))
        .map(getFromUserService)
        .map(result => result.isAdmin ? "adminPage" : "userPage")
        .toAsync();

    page.ifPresentOrElse(redirectTo, () => {
        throw new Error("Cannot be Null")
    })
}

Получить задачи, если завершено, отобразить заголовок или вернуть пустую строку

Императивный код

const rawResults = await fetch('https://jsonplaceholder.typicode.com/todos/' + item);
const response = await rawResults.json();
if (response.completed) {
    return response.title
} else {
    return null
}

С декларативным необязательным

return await Optional.of('https://jsonplaceholder.typicode.com/todos/' + item)
    .map(fetch)
    .map(response => response.json())
    .filter(response => response.completed == true)
    .map(response => response.title)
    .getAsync();

Заключение

Часто цепочка выражений/функций помогает нам сохранить код чистым, тестируемым и простым для рассуждений.

Эта библиотека пытается сделать это простым способом.

Код проверен в бою. Документация находится в процессе.

Ссылки