Skip to content

Instantly share code, notes, and snippets.

@gemmadlou
Last active September 28, 2017 11:13
Show Gist options
  • Select an option

  • Save gemmadlou/eb782fdb6c3dd8de2a084a8f36f8a51e to your computer and use it in GitHub Desktop.

Select an option

Save gemmadlou/eb782fdb6c3dd8de2a084a8f36f8a51e to your computer and use it in GitHub Desktop.
Functional Domain Modelling
console.clear();
let initstate = {
attendees: [],
likes: [],
matches: [],
meetings: [],
}
let addDelegate = (State, name) => {
let state = Object.assign({}, State);
state.attendees.push({
name: name,
type: 'delegate',
likes: []
})
return state;
}
let addSupplier = (State, name) => {
let state = Object.assign({}, State);
state.attendees.push({
name: name,
type: 'supplier',
likes: []
});
return state;
}
let getAttendeeIndex = (State, name) => {
let state = Object.assign({}, State);
return state.attendees.findIndex((attendee) => {
return attendee.name === name;
});
}
let addNumberOfMeetings = (State, name, num) => {
let state = Object.assign({}, State);
state.attendees[getAttendeeIndex(state, name)].numMeetings = num;
return state;
}
let addLike = (State, like) => {
let state = Object.assign({}, State);
state.likes.push(like);
return state;
}
let addAttendeeLike = (State, name, like) => {
let state = Object.assign({}, State);
state.attendees[getAttendeeIndex(state, name)].likes.push(like);
return state;
}
let event = addDelegate(initstate, 'gemma');
event = addNumberOfMeetings(event, 'gemma', 1);
event = addDelegate(event, 'tomas');
event = addNumberOfMeetings(event, 'tomas', 2);
event = addDelegate(event, 'george');
event = addNumberOfMeetings(event, 'george', 2);
event = addDelegate(event, 'mj');
event = addNumberOfMeetings(event, 'mj', 1);
event = addSupplier(event, 'mcdonalds');
event = addNumberOfMeetings(event, 'mcdonalds', 2);
event = addSupplier(event, 'google');
event = addNumberOfMeetings(event, 'google', 1);
event = addLike(event, 'food');
event = addLike(event, 'internet');
event = addAttendeeLike(event, 'gemma', 'food');
event = addAttendeeLike(event, 'gemma', 'internet');
event = addAttendeeLike(event, 'tomas', 'internet');
event = addAttendeeLike(event, 'george', 'internet');
event = addAttendeeLike(event, 'mj', 'food');
event = addAttendeeLike(event, 'google', 'internet');
event = addAttendeeLike(event, 'mcdonalds', 'food');
let calculateMatches = (State) => {
return State.attendees.filter((attendee) => {
return attendee.type === 'supplier';
}).map((supplier) => {
return State.attendees.filter((attendee) => {
return attendee.type === 'delegate';
}).map((delegate) => {
let sharedLikes = supplier.likes.filter((like) => {
return delegate.likes.indexOf(like) !== -1;
});
return {
supplier: supplier,
delegate: delegate,
likes: sharedLikes,
score: sharedLikes.length
};
// alternative reply with an array
// return [supplier.name].concat(delegate.name);
})
}).reduce((prev, curr) => {
return prev.concat(curr);
}, [])
}
let setMatches = (State) => {
let state = Object.assign({}, State);
state.matches = calculateMatches(state);
return state;
}
event = setMatches(event)
console.log(event);

var initstate = {
currentSlide: 1
}
var goNext = (state) => {
let newstate = Object.assign({}, state);
newstate.currentSlide++;
return newstate;
}
var goPrev = (state) => {
let newstate = Object.assign({}, state);
newstate.currentSlide = newstate.currentSlide === 1
? 1 : newstate.currentSlide - 1;
return newstate;
}
var assert = (item) => {
return {
equals(check) {
return item === check;
}
}
}
var state = goNext(initstate);
state = goNext(state);
state = goPrev(state);
assert(state.currentSlide).equals(2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment