작품: https://code-art.pictures/
다음과 같은 도서관을 상상해 보세요.
이 모든 요구 사항에 맞는 라이브러리를 찾을 수 없어서 작은 라이브러리인 Fluent-Streams를 만들었습니다.
const words = ['Lorem', 'ipsum', /* ... */] stream(words) .groupBy(word => word.toLowerCase()) .map(([word, list]) => [word, list.length]) .sortBy(([, length]) => -length) .take(3) .toArray() // => ['ut', 3], ['in', 3], ['dolor', 2]
// Endless stream of 2..999 integers const randomInts = continually(() => 2 + Math.floor(Math.random() * 998) ) randomInts .zip(randomInts) .filter(([a, b]) => gcd(a, b) === 1) .distinctBy(pair => stream(pair).sortBy(i => i).join()) .take(10) // => [804, 835], [589, 642], [96, 145], ...
const deck = streamOf('♠', '♥', '♣', '♦') .flatMap(suit => streamOf<string | number>( 'A', ...range(2, 11), 'J', 'Q', 'K' ).map(rank => `${rank}${suit}`) ) // => 'A♠', '2♠', '3♠', ...
const playersNum = 2 const [flop, turn, river, ...hands] = deck .takeRandom(3 + 1 + 1 + playersNum * 2) .zipWithIndex() .splitWhen((_, [, j]) => j === 3 // flop || j === 4 // turn || j >= 5 // river && j % 2 === 1 // ...players' hands ) .map(chunk => // Unzip index chunk.map(([card]) => card) ) // flop = ['3♦', '9♣', 'J♦'] // turn = ['4♣'] // river = ['7♦'] // hands = ['J♠', '4♥'], ['10♠', '8♥']
첫 번째 플레이어는 플랍에 잭 한 쌍을 가지고 있고 두 번째 플레이어는 스트레이트를 가지고 있지만 리버에서만 가능합니다. 누가 이길까요?
위의 모든 것은 기본 데이터 구조만으로 달성할 수 있습니다. 그러나 Fluent Streams로 작성된 코드는 읽기가 더 좋습니다. 코드를 더 읽기 쉽게 만드는 것은 완벽하게 유효한 목표이지만 이를 달성하는 데 드는 비용은 인지 부하, 번들 크기 및 성능 측면에서 낮아야 합니다.
Fluent Streams가 바로 그런 경우입니다! 이유는 다음과 같습니다.
라이브러리는 변환되지 않은 ES5로 배송됩니다. 이 결정은 매우 간결한 코드, 특히 생성기로 반복을 가능하게 하는 ES6 기능을 활용하여 달성되는 작은 번들 크기를 유지하려는 욕구에 의해 이루어졌습니다. 그러나 널리 지원되는 언어 기능만 활용됩니다.
아직 ES5로 트랜스파일하는 중이라면 직접 트랜스파일하고 폴리필을 추가하여 라이브러리를 사용할 수 있습니다. 하지만 이렇게 하면 번들 크기가 늘어나므로 권장되지 않습니다. 대신, 이는 빌드 구성을 다시 검토하고 최신 JavaScript 기능을 수용할 수 있는 완벽한 기회일 수 있습니다.
위 내용은 Fluent Streams: 풍부한 반복 가능 조작을 위한 라이브러리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!