Implementa operações básicas da capacidade Stream.
Em linguagens funcionais, funções como filter, map e
reduce são muito comuns. Implementa uma série de combinadores funcionais básicos para uma capacidade de fluxo
sem usares funções existentes. Para isto, vais precisar de escrever os teus próprios manipuladores de capacidades.
💡 Vamos chamar a esta capacidade MyStream para evitar conflitos com a capacidade Stream existente na biblioteca padrão.
As operações que precisas de implementar são:
MyStream.fromList (dada uma lista de elementos, cria um fluxo de elementos )MyStream.toList (dado um fluxo de elementos, materializa-o numa lista)MyStream.toListWithResult (dado um fluxo de elementos, materializa-o numa lista a par do resultado da função de fluxo)MyStream.ignore (dado um fluxo de elementos, ignora os valores emitidos, devolvendo os resultados da função de fluxo)MyStream.filter (dado um predicado e um MyStream, devolve o MyStream de todos os itens para os quais predicate(item) é verdadeiro);MyStream.map (dada uma função e um MyStream, devolve o MyStream dos resultados de aplicar function(item) a todos os itens);MyStream.flatMap (dada uma função que produz um MyStream e um MyStream, devolve o MyStream dos resultados de aplicar function(item) a todos os itens)Uma Stream é uma ability do Unison que serve para emitir valores.
Podes usar a ability Stream se tiveres uma função que deve produzir valores como efeito secundário enquanto está a ser chamada. Por exemplo, esta função devolve o último valor da lista, mas emite um total acumulado à medida que cada elemento é visto:
emitRunningTotal : '{Stream Nat} Nat
emitRunningTotal = 'let
use Nat +
List.foldLeft (
acc a -> let
runningTotal = acc + a
Stream.emit runningTotal
a
) 0 [1,2,3,4,5]
Podemos materializar a Stream como uma List, a par do valor devolvido da função que a produz, com um handler de abilities:
> Stream.toListWithResult! emitRunningTotal
⧩
([1, 3, 5, 7, 9], 5)
Inscreve-te no Exercism para aprenderes e dominares Unison com 53 exercícios, e mentoria humana real, tudo grátis.