Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct Event {
- let start : Date
- let end : Date
- }
- struct TimeRect {
- let top : Double
- let left : Double
- let bottom : Double
- let right : Double
- }
- func getCalendar(_ array : [Event], _ maxWidth: Double) -> [TimeRect]{
- guard array.count > 0 else { return []}
- var res = [TimeRect]()
- // 1. sort the [Event] by start time
- sortEvent(array)
- i = 0
- // 2. Find overlapping events group.
- // Within the group, layout the events and add to res
- while i < array.count {
- var overlappingEvents = [Event]()
- let event = array[i]
- overlappingEvents.append(event)
- let maxCurrentEndTime = event.end
- i += 1
- while i < array.count {
- nextEvent = array[i]
- if (nextEvent.start < maxCurrentEndTime){
- i += 1
- overlappingEvents.append(event)
- maxCurrentEndTime = max(maxCurrentEndTime,nextEvent.end )
- } else {
- break
- }
- }
- // Handle overlapping event. it has at least 1 event
- HandleOverlap(overlappingEvents, maxWidth, res)
- }
- return res
- }
- func HandleOverlap(_ overlappingEvents : [Event], _ maxWidth: Double, _ res: inout [TimeRect]) {
- guard overlappingEvents.count > 0 else { return }
- let left = 0
- let width = maxWidth / overlappingEvents.count
- while i < overlappingEvents.count {
- let event = overlappingEvents[i]
- let h = event.end - event.start
- y = event.start
- res.append(TimeRect(left:left, top: event.start, bottom: event.end, right: left + width))
- left += width
- i += 1
- }
- }
Add Comment
Please, Sign In to add comment