Last active
September 28, 2017 11:13
-
-
Save gemmadlou/eb782fdb6c3dd8de2a084a8f36f8a51e to your computer and use it in GitHub Desktop.
Functional Domain Modelling
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| | |
| 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