Skip to content

Instantly share code, notes, and snippets.

@ivanopagano
Last active August 29, 2015 14:19
Show Gist options
  • Save ivanopagano/5343b624f6ce29def392 to your computer and use it in GitHub Desktop.
Save ivanopagano/5343b624f6ce29def392 to your computer and use it in GitHub Desktop.
Example of functionaljava lifting to a Validation result
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