package no.java.incogito.domain; import fj.*; import static fj.Function.*; import fj.data.*; import no.java.incogito.domain.UserSessionAssociation.*; /** * @author <a href="mailto:trygve.laugstol@arktekk.no">Trygve Laugstøl</a> * @version $Id$ */ public class User { public static final TreeMap<SessionId, UserSessionAssociation> emptySessionAssociations = TreeMap.empty(SessionId.ord); public final UserId id; public final Option<String> name; public final TreeMap<SessionId, UserSessionAssociation> sessionAssociations; /** * If none, this is a pristine object. */ public final Option<User> original; // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- private User(UserId id, Option<String> name, TreeMap<SessionId, UserSessionAssociation> sessionAssociations, Option<User> original) { this.id = id; this.name = name; this.sessionAssociations = sessionAssociations; this.original = original; } // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- public static User createPristineUser(UserId id) { return new User(id, Option.<String>none(), TreeMap.<SessionId, UserSessionAssociation>empty(SessionId.ord), Option.<User>none()); } public static User createPersistentUser(UserId id, Option<String> name, TreeMap<SessionId, UserSessionAssociation> sessionAssociations) { return new User(id, name, sessionAssociations, Option.<User>none()); } // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- public User setInterestLevel(SessionId sessionId, InterestLevel interestLevel) { UserSessionAssociation userSessionAssociation = sessionAssociations.get(sessionId). orSome(UserSessionAssociation.$constructor_().f(sessionId).f(interestLevel)). interestLevel(interestLevel); return new User(id, name, sessionAssociations.set(sessionId, userSessionAssociation), original); } // ----------------------------------------------------------------------- // Higher-order functions // ----------------------------------------------------------------------- public static final F<User, TreeMap<SessionId, UserSessionAssociation>> sessionAssociations_ = new F<User, TreeMap<SessionId, UserSessionAssociation>>() { public TreeMap<SessionId, UserSessionAssociation> f(User user) { return user.sessionAssociations; } }; public static final F<SessionId, F<InterestLevel, F<User, User>>> setInterestLevel = curry(new F3<SessionId, InterestLevel, User, User>() { public User f(SessionId sessionId, InterestLevel interestLevel, User user) { return user.setInterestLevel(sessionId, interestLevel); } }); // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- public static class UserId { public final String value; public UserId(String value) { this.value = value; } public static UserId userIdFromString(String value) { return new UserId(value); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; UserId userId = (UserId) o; return value.equals(userId.value); } @Override public int hashCode() { return value.hashCode(); } public static final F<String, UserId> userId = new F<String, UserId>() { public UserId f(String value) { return userIdFromString(value); } }; } }