Last active
August 29, 2015 14:19
-
-
Save ivanopagano/5343b624f6ce29def392 to your computer and use it in GitHub Desktop.
Example of functionaljava lifting to a Validation result
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import fj.* | |
import fj.data.* | |
import static LiftingMiaClasse.* | |
class UsaClasse { | |
//ho importato staticamente i metodi di lifting a funzione per una sintassi piu' scorrevole | |
public static void usa() { | |
Validation<String, Risultato> risultato = faiQuesto() | |
.bind(faiQuello) | |
.bind(faiCodesto) | |
.bind(faiQuestAltro) | |
.bind(eQuestAltroAncora) | |
.bind(neHaiAbbastanza); | |
//A questo punto si possono fare diverse cose con la validazione | |
//verifico se ci sono stati errori | |
Boolean succeeded = risultato.isSuccess(); | |
Boolean failed = risultato.isFail(); | |
//Ottengo il risultato | |
Risultato risultatoOppureLanciaError = risultato.success(); | |
Risultato risultatoOppureAlternativa = risultato.orSuccess(new Risultato("alternativa")); | |
//Chiamo una funzione sul risultato se c'e', ad esempio stampa a schermo | |
risultato.foreach(new F<Risultato, Unit>() { | |
public Unit f(Risultato r) { | |
System.out.println(r.contentuto); | |
return Unit.unit(); | |
} | |
}); | |
//Mappo l'eventuale risultato in un'altro oggetto, mantenendo i possibili errori | |
Validation<String, String> contenuto = risultato.map(new F<Risultato, String>() { | |
public String f(Risultato r) { | |
return r.contentuto; | |
} | |
}); | |
//Gestisco gli errori | |
String erroreOppureLanciaError = risultato.fail(); | |
//Posso convertire gli errori in un tipo diverso | |
Validation<Exception, Risultato> rimappoErrore = risultato.f().map(new F<String, Exception>() { | |
public Exception f(String msg) { | |
return new Exception(msg); | |
} | |
}); | |
//Posso gestire entrambi i casi con un unica chiamata (detta catamorfismo) | |
String valore = risultato.validation( | |
new F<String, String>() { | |
public String f(String error) { | |
return "Ops, ho avuto un problema, " + error; | |
} | |
}, | |
new F<Risultato, String>() { | |
public String f(Risultato r) { | |
return r.contentuto; | |
} | |
}); | |
} | |
} | |
class LiftingMiaClasse { | |
/*Nota: In alternativa gli errori potrebbero essere accumulati | |
* usando l'apposita funzione del tipo Validation | |
* In questo caso dovremmo fare una versione diversa di ciascuno di questi | |
* metodi, che accumula l'errore col precedente invece di crearne uno nuovo | |
*/ | |
public static Validation<String, MiaClasse> faiQuesto() { | |
try { | |
return Validation.success(MiaClasse.faiQuesto()); | |
} catch (Exception e) { | |
return Validation.fail(e.getMessage()); | |
} | |
} | |
public static F<MiaClasse, Validation<String, MiaClasse> faiQuello = new F<> { | |
public Validation<String, MiaClasse> f(MiaClasse mc) { | |
try { | |
return Validation.success(mc.faiQuello()); | |
} catch (Exception e) { | |
return Validation.fail(e.getMessage()); | |
} | |
} | |
} | |
public static F<MiaClasse, Validation<String, MiaClasse> faiCodesto = new F<> { | |
public Validation<String, MiaClasse> f(MiaClasse mc) { | |
try { | |
return Validation.success(mc.faiCodesto()); | |
} catch (Exception e) { | |
return Validation.fail(e.getMessage()); | |
} | |
} | |
} | |
//... ometto un po' di funzioni statiche tutte uguali, credo che ci siamo capiti | |
public static F<MiaClasse, Validation<String, Risultato> neHaiAbbastanza = new F<> { | |
public Validation<String, Risultato> f(MiaClasse mc) { | |
try { | |
return Validation.success(mc.neHaiAbbastanza()); | |
} catch (Exception e) { | |
return Validation.fail(e.getMessage()); | |
} | |
} | |
} | |
} | |
class Risultato { | |
public final String contenuto; | |
public Risultato(String cnt) { | |
contenuto = cnt; | |
} | |
} | |
class MiaClasse { | |
public static MiaClasse faiQuesto() {return this;} | |
public MiaClasse faiQuello() {return this;} | |
public MiaClasse faiCodesto() {return this;} | |
public MiaClasse faiQuestAltro() {return this;} | |
public MiaClasse eQuestAltroAncora() {return this;} | |
public MiaClasse neHaiAbbastanza() {return new Risultato("abbastanza");} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment