Skip to content

Instantly share code, notes, and snippets.

View NTCoding's full-sized avatar

Nick Tune NTCoding

View GitHub Profile
object Wiring {
val recommendAFriend = useCases.RecommendAFriend(
ValidateNewAccount.apply, FindUser.apply, CreateFriend.apply,
PromoteToGoldStatus.apply
)
}
object RecommendAFriend {
type RecommendAFriendResult = Either[RecommendAFriendError, Seq[ReferralOutcome]]
type RecommendAFriend = (UserId, NewAccountDetails) => Future[Either[RecommendAFriendError, Seq[ReferralOutcome]]]
type ValidateNewAccount = NewAccountDetails => Option[RecommendAFriendError]
type FindUser = UserId => Future[Option[User]]
type CreateFriend = NewAccountDetails => Future[User]
def apply(v: ValidateNewAccount, f: FindUser, c: CreateFriend, p: ReferralPolicy)
(u: UserId, n: NewAccountDetails): Future[RecommendAFriendResult] =
v(n) map { err } getOrElse { f(u) flatMap {
object RecommendAFriend{
type Validate = NewAccountDetails => Unit
type FindCustomer = String => Option[User]
type CreateCustomer = NewAccountDetails => User
type ReferralPolicy = NewAccountDetails => User
def apply(validate: Validate, findCustomer: FindCustomer, createCustomer: CreateCustomer,
referralPolicy: ReferralPolicy)
(referrerId: Int, friendsAccountDetails: NewAcccountDetails) = {
...
object RecommendAFriend{
def apply(validate: NewAccountDetails => Unit, findCustomer: String => Option[User],
createCustomer: NewAccountDetails => User, referralPolicy: (User, User) => Future[Unit])
(referrerId: Int, friendsAccountDetails: NewAcccountDetails) = {
validate(friendsAccountDetails)
val user = findCustomer(referrerId);
val friend = createCustomer(friendsAccountDetails)
referralPolicy(user, friend)
}
var referrer = customerDirectory.Find(referrerId);
var friend = customerDirectory.Add(friendsAccountDetails);
referralPolicy.Apply(referrer, friend);
// construct
val recommendAFriend = RecommendAFriend(validator, customers, policy)
// invoke
recomendAFriend(referrerId, accountDetails)
object RecommendAFriend {
def apply(validator: NewAccountValidator, customers: CustomerDirectory, policy: ReferralPolicy)
(referrerId: Int, friendsAccountDetails: NewAccountDetails) =
...
}
RecommendAFriend(customers, policy, referrerId, friendsAccountDetails)
object RecommendAFriend {
def apply(customers: CustomerDirectory, policy: ReferralPolicy, referrerId: Int, friendsAccountDetails: NewAccountDetails) =
...
}
public class RecommendAFriendService
{
private INewAccountValidator validator;
private ICustomerDirectory customerDirectory;
private IReferralPolicy referralPolicy;
public RecommendAFriendService(ICustomerDirectory customerDirectory, IReferralPolicy referralPolicy,
INewAccountValidator validator)
{
this.validator = validator;