Skip to content

Instantly share code, notes, and snippets.

@nvanderw
Created January 6, 2014 03:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nvanderw/8277693 to your computer and use it in GitHub Desktop.
Save nvanderw/8277693 to your computer and use it in GitHub Desktop.
lol java
interface MaybeVisitor<A, R> {
public R just(A v);
public R nothing();
}
interface Maybe<A> {
public <R> R fold(MaybeVisitor<A, R> visitor);
}
interface PairVisitor<A, B, R> {
public R visit(A fst, B snd);
}
interface Pair<A, B> {
public <R> R fold(PairVisitor<A, B, R> visitor);
}
interface ListVisitor<A, R> {
public R cons(A head, R tail);
public R nil();
}
interface List<A> {
public <R> R fold(ListVisitor<A, R> visitor);
}
public abstract class Config implements List<Pair<String, String>> {
private Config() {
}
private static Config empty = null;
public static Config getEmpty() {
if(empty == null)
empty = new Config() {
public <R> R fold(ListVisitor<Pair<String, String>, R> visitor) {
return visitor.nil();
}
};
return empty;
}
public Config set(final String key, final String val) {
final Config old = this;
return new Config() {
public <R> R fold(ListVisitor<Pair<String, String>, R> visitor) {
return visitor.cons(
new Pair<String, String>() {
public <R> R fold(PairVisitor<String, String, R> visitor) {
return visitor.visit(key, val);
}
},
old.fold(visitor));
}
};
}
public Maybe<String> lookup(final String key) {
return fold(new ListVisitor<Pair<String, String>, Maybe<String>>() {
public Maybe<String> cons(final Pair<String, String> head, final Maybe<String> tail) {
return head.fold(new PairVisitor<String, String, Maybe<String>>() {
public Maybe<String> visit(final String fst, final String snd) {
if(fst.equals(key))
return new Maybe<String>() {
public <R> R fold(final MaybeVisitor<String, R> visitor) {
return visitor.just(snd);
}
};
else
return new Maybe<String>() {
public <R> R fold(final MaybeVisitor<String, R> visitor) {
return visitor.nothing();
}
};
}
}).fold(new MaybeVisitor<String, Maybe<String>>() {
// We found the key in the head of the list.
public Maybe<String> just(final String s) {
return new Maybe<String>() {
public <R> R fold(MaybeVisitor<String, R> visitor) {
return visitor.just(s);
}
};
}
public Maybe<String> nothing() {
return tail;
}
});
}
public Maybe<String> nil() {
return new Maybe<String>() {
public <R> R fold(MaybeVisitor<String, R> visitor) {
return visitor.nothing();
}
};
}
});
}
public static void main(String[] args) {
Config cfg = Config.getEmpty().set("hello", "world").set("hello", "nick");
Maybe<String> result = cfg.lookup("hello");
result.fold(new MaybeVisitor<String, Void>() {
public Void just(String a) {
System.out.println(a);
return null;
}
public Void nothing() {
System.out.println("Didn't find anything!");
return null;
}
});
}
}
@mgodave
Copy link

mgodave commented May 20, 2015

LOL is right

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment