Guest User

Untitled

a guest
May 20th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.63 KB | None | 0 0
  1. data Contact = Contact { name :: String
  2. , phone :: [String]
  3. } deriving (Show, Read, Eq, Ord)
  4.  
  5. data Date = Date { day :: Int
  6. , month :: Int
  7. } deriving (Show, Read, Eq, Ord)
  8.  
  9. data Birthday = Birthday { nick :: String
  10. , date :: Date
  11. } deriving (Show, Read, Eq, Ord)
  12.  
  13. data Time = Time { hours :: Int
  14. , minutes :: Int
  15. } deriving (Show, Read, Eq, Ord)
  16.  
  17. data Event = Event { dateEvent :: Date
  18. , time :: Time
  19. , place :: String
  20. , description :: String
  21. , notes :: String
  22. } deriving (Show, Read, Eq, Ord)
  23.  
  24. data Note = Note { contact :: Contact
  25. , birthday :: Birthday
  26. , events :: [Event]
  27. } deriving (Show, Read, Eq, Ord)
  28.  
  29.  
  30.  
  31. contact1, contact2, contact3, contact4, contact5 :: Contact
  32. contact1 = Contact "Sergio" ["067-431-26-22"]
  33. contact2 = Contact "Olha" ["050-662-11-08", "067-147-32-65"]
  34. contact3 = Contact "Sophie" []
  35. contact4 = Contact "GrandPa" ["067-478-21-56"]
  36. contact5 = Contact "GrandMa" ["067-324-98-43"]
  37.  
  38. birthday1, birthday2, birthday3, birthday4, birthday5 :: Birthday
  39. birthday1 = Birthday "Sergio" Date {day = 1, month = 1}
  40. birthday2 = Birthday "Olha" Date {day = 11, month = 8}
  41. birthday3 = Birthday "Sophie" Date {day = 6, month = 11}
  42. birthday4 = Birthday "GrandPa" Date {day = 16, month = 5}
  43. birthday5 = Birthday "GrandMa" Date {day = 29, month = 11}
  44.  
  45. events1, events2, events3, events4, events5 :: [Event]
  46. events1 = [Event {dateEvent = Date {day = 1, month = 1}, time = Time {hours = 18, minutes = 0 }, place = "Kyiv restaurant", description = "celebrate Birthday", notes = "be prepared"}, Event {dateEvent = Date {day = 6, month = 6}, time = Time {hours = 10, minutes = 20 }, place = "KPI", description = "first study day", notes = "take laptop"}]
  47. events2 = [Event {dateEvent = Date {day = 30, month = 5}, time = Time {hours = 17, minutes = 30 }, place = "Kyiv airport", description = "meet sister", notes = "take taxi"}]
  48. events3 = [Event {dateEvent = Date {day = 1, month = 1}, time = Time {hours = 11, minutes = 0 }, place = "mall", description = "visit playground", notes = "appr. 2 hours"}]
  49. events4 = [Event {dateEvent = Date {day = 16, month = 5}, time = Time {hours = 10, minutes = 15 }, place = "Skype", description = "have a talk", notes = ""}]
  50. events5 = [Event {dateEvent = Date {day = 29, month = 11}, time = Time {hours = 17, minutes = 0 }, place = "Drabiv", description = "celebrate Birthday", notes = "take a cake"}, Event {dateEvent = Date {day = 21, month = 07}, time = Time {hours = 10, minutes = 0 }, place = "Skype", description = "have a talk", notes = "brother"}]
  51.  
  52.  
  53. myNotes :: [Note]
  54. myNotes = [Note {contact = contact1, birthday = birthday1, events = events1}, Note {contact = contact2, birthday = birthday2, events = events2}, Note {contact = contact3, birthday = birthday3, events = events3}, Note {contact = contact4, birthday = birthday4, events = events4}, Note {contact = contact5, birthday = birthday5, events = events5}]
  55.  
  56.  
  57. eventsByDate :: [Note] -> Date -> [Event]
  58. eventsByDate notes date = eventsByDateAcc notes date []
  59.  
  60. eventsByDateAcc :: [Note] -> Date -> [Event] -> [Event]
  61. eventsByDateAcc [] _ acc = acc
  62. eventsByDateAcc _ Date {day = 0, month = 0} acc = acc
  63. eventsByDateAcc (note:notes) date acc = eventsByDateAcc notes date (acc ++ (getEventByDate note date [] ) )
  64.  
  65. getEventByDate :: Note -> Date -> [Event] -> [Event]
  66. getEventByDate (Note {contact = _, birthday = _, events = e}) date acc
  67. | e == [] = acc
  68. getEventByDate (Note {contact = c, birthday = b, events = (e:es)}) date acc
  69. | checkDates e date == True = getEventByDate Note {contact = c, birthday = b, events = es} date (acc ++ [e])
  70. | otherwise = getEventByDate Note {contact = c, birthday = b, events = es} date acc
  71.  
  72. checkDates :: Event -> Date -> Bool
  73. checkDates (Event {dateEvent = Date {day = eD, month = eM}, time = _, place = _, description = _, notes = _}) (Date {day = d, month = m})
  74. | eD == d && eM == m = True
  75. | otherwise = False
  76.  
  77.  
  78. eventsByPeriod :: [Note] -> Date -> Date -> [Event]
  79. eventsByPeriod notes dateFrom dateTo = eventsByPeriodAcc notes dateFrom dateTo []
  80.  
  81. eventsByPeriodAcc :: [Note] -> Date -> Date -> [Event] -> [Event]
  82. eventsByPeriodAcc [] _ _ acc = acc
  83. eventsByPeriodAcc (note:notes) dateFrom dateTo acc = eventsByPeriodAcc notes dateFrom dateTo (acc ++ (getEventByPeriod note dateFrom dateTo [] ) )
  84.  
  85. getEventByPeriod :: Note -> Date -> Date -> [Event] -> [Event]
  86. getEventByPeriod (Note {contact = _, birthday = _, events = eP}) dateFrom dateTo acc
  87. | eP == [] = acc
  88. getEventByPeriod (Note {contact = c, birthday = b, events = (eP:ePs)}) dateFrom dateTo acc
  89. | checkPeriod eP dateFrom dateTo == True = getEventByPeriod Note {contact = c, birthday = b, events = ePs} dateFrom dateTo (acc ++ [eP])
  90. | otherwise = getEventByPeriod Note {contact = c, birthday = b, events = ePs} dateFrom dateTo acc
  91.  
  92. checkPeriod :: Event -> Date -> Date -> Bool
  93. checkPeriod (Event {dateEvent = Date {day = eD, month = eM}, time = _, place = _, description = _, notes = _}) (Date {day = dFrom, month = mFrom}) (Date {day = dTo, month = mTo})
  94. | ((30*eM + eD) >= (30*mFrom + dFrom)) && ((30*eM + eD) <= (30*mTo + dTo)) = True
  95. | otherwise = False
  96.  
  97.  
  98. searchByString :: [Note] -> String -> [Note]
  99. notes `searchByString` searchString = searchByStringAcc notes searchString []
  100.  
  101. searchByStringAcc :: [Note] -> String -> [Note] -> [Note]
  102. searchByStringAcc [] _ acc = acc
  103. searchByStringAcc (note:notes) searchString acc
  104. | ( compareWithSearchString note searchString ) == True = searchByStringAcc notes searchString ( note:acc )
  105. | ( compareWithSearchString note searchString ) == False = searchByStringAcc notes searchString acc
  106.  
  107. compareWithSearchString :: Note -> String -> Bool
  108. compareWithSearchString ( Note {contact = ( Contact {name = myName, phone = _ }), birthday = _, events = _} ) searchString
  109. | myName == [] && searchString == [] = True
  110. | myName == [] && searchString /= [] = False
  111. compareWithSearchString ( Note {contact = (Contact {name = (n:ns), phone = p }), birthday = b, events = e} ) (s:ss)
  112. | n == s = compareWithSearchString ( Note { contact = ( Contact { name = ns, phone = p } ), birthday = b, events = e} ) ss
  113. | otherwise = False
Add Comment
Please, Sign In to add comment