Tango, uma biblioteca para programação funcional em C#

Olá pessoa!

Hoje vou apresentar algo que estou trabalhando já faz um tempo, uma biblioteca para programação funcional em C#!

TANGO

Quem me conhece sabe que sou bastante entusiasta deste paradigma, mas não, não vou listar motivos X ou Y para tentar provar que ele é melhor do que orientação à objeto.

Ao invés disso, podemos só utilizar os dois e sermos mais felizes.

Infelizmente programação funcional ainda é um tanto quanto nichada. Tenho muitos amigos programadores, mas dá para contar na mão os que usam o paradigma, considerando os iniciantes.

Em outubro deste ano, tive o prazer de lançar um livro sobre programação funcional em .NET, onde explico diversos conceitos utilizando C# e F#, você pode encontrá-lo aqui.

Mas, o que é a Tango?

A Tango é uma biblioteca que provê uma série de funções e tipos para auxiliar um programador C#, o objetivo principal é trazer a programação funcional de uma forma mais acessível para os programadores que ainda não estão acostumados com este paradigma. Similar ao que a biblioteca System.Linq fez.

Você pode instalar a Tango em seu projeto utilizando o NuGet.

PM> Install-Package Tango

A partir daí é só aproveitar as funcionalidades!

Em sua data de lançamento, os principais temas que considero destaques da Tango são:

Utilize pattern matching com valores opcionais e valores Either

Option<int> optionalValue = 10;
int value = optionalValue.Match(
                methodWhenSome: number => number,
                methodWhenNone: () => 0);

Either<bool, int> eitherValue = 10;
int value = eitherValue.Match(
                methodWhenRight: number => number,
                methodWhenLeft: boolean => 0);

Crie processos contínuos utilizando Then e Catch e retornos de tipos diferentes

Continuation<string, int> continuation = 5;

continuation.Then(value => value + 4)
            .Then(value =>
            {
                if( value % 2 == 0)
                    return value + 5;
                else
                    return "ERROR";
            })
            .Then(value => value + 10)
            .Catch(fail => $"{fail} catched");

Crie processos contínuos utilizando pipeline!

continuation
    > (value => value + 4)
    > (value =>
    {
        if( value % 2 == 0)
            return value + 5;
        else
            return "ERROR";
    })
    > (value => value + 10)
    >= (fail => $"{fail} catched")

Utilize Poderosas Funções de alta ordem!

//IEnumerable<int> source = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
IEnumerable<IEnumerable<int>> result = source.ChunkBySize(3);

//result = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10} }

var (resultEvens, resultOdds) =
source.Partition(value => value % 2 == 0)

//resultEvens = { 2, 4, 6, 8, 10 }
//resultOdds = { 1, 3, 5, 7, 9 }

Utilize operações para redução!

int result = source.Scan(10, IntegerOperations.Add);
//result = {11, 13, 16, 20, 25, 31, 38, 46, 55, 65}

Utilize Curry e Aplicação Parcial!

Func<int, int, int> add =
    (value, value2) => value + value2;

Func<int, Func<int, int>> addCurried = add.Curry();
curriedResult = addCurried(2)(3);

Func<int, int> addPartial = add.PartialApply(2);
int partialResult = addPartial(3);

Aproveite o QuickDelegateCast!

using static Tango.Functional.QuickDelegateCast;

int SampleAdd(int value1, int value2)
    => value1 + value2;

F<int, int, int>(SampleAdd).Curry();
F<int, int, int>(SampleAdd).PartialApply(1);

Documentação

Mas como você vai saber utilizar isso tudo?

Não se preocupe, a Tango tem uma documentação bastante completa que pode ser acessada online ou se preferir, você pode fazer o download do arquivo no formato de sua preferência.

Capa do livro

Faça download do livro da documentação:

Totalmente Gratuita

É importante frisar que a Tango é completamente gratuita, seu código está disponível no GitHub e sua documentação no Gitbooks.

Você pode me ajudar favoritando ⭐️(star) o repositório da biblioteca e abrindo uma issue caso encontre algum problema, tanto no código quanto na documentação.

E claro, se gostar dela, conte para os seus amigos também, não custa nada.

O que você achou deste post?

Me conte nos comentários!

E Até mais!

Sempre vale lembrar que as informações e textos aqui no blog representam minha opinião pessoal, o que pode não ser igual à sua ou de qualquer outra pessoa, incluindo a empresa para qual eu trabalho. Portanto as publicações inseridas aqui estão relacionadas somente a mim.

Assine a Newsletter