{-# LANGUAGE GADTs #-}
import Data.List
import Data.Map as Map
import Data.Time
data Model a where
Variant :: [(Day, a)] -> Model a
day1 = fromGregorian 1987 10 17
day2 = fromGregorian 1987 10 18
day3 = fromGregorian 1987 10 19
day4 = fromGregorian 1987 10 20
day5 = fromGregorian 1987 10 21
day6 = fromGregorian 1987 10 22
m1
= Variant
[(day1
, 1), (day3
, 3), (day5
, 5)] :: Model
Integerm2
= Variant
[(day1
, 1), (day2
, 2), (day4
, 4), (day6
, 6)] :: Model
Integer
(Variant a) &+ (Variant b) =
Variant
$ snd $ mapAccumL
(\r
(d
, k
) -> let r
' = r + k in (r', (d
, r
'))) 0 $ toList $ Map.unionWith (+)
(Map.fromDistinctAscList a)
(Map.fromDistinctAscList b)
main = print $ m1 &+ m2
ey0jIExBTkdVQUdFIEdBRFRzICMtfQoKaW1wb3J0IERhdGEuTGlzdAppbXBvcnQgRGF0YS5NYXAgYXMgTWFwCmltcG9ydCBEYXRhLlRpbWUKCmRhdGEgTW9kZWwgYSB3aGVyZQoJVmFyaWFudCAgOjogWyhEYXksIGEpXSAtPiBNb2RlbCBhCglkZXJpdmluZyAoU2hvdykKCmRheTEgPSBmcm9tR3JlZ29yaWFuIDE5ODcgMTAgMTcKZGF5MiA9IGZyb21HcmVnb3JpYW4gMTk4NyAxMCAxOApkYXkzID0gZnJvbUdyZWdvcmlhbiAxOTg3IDEwIDE5CmRheTQgPSBmcm9tR3JlZ29yaWFuIDE5ODcgMTAgMjAKZGF5NSA9IGZyb21HcmVnb3JpYW4gMTk4NyAxMCAyMQpkYXk2ID0gZnJvbUdyZWdvcmlhbiAxOTg3IDEwIDIyCgptMSA9IFZhcmlhbnQgWyhkYXkxLCAxKSwgKGRheTMsIDMpLCAoZGF5NSwgNSldIDo6IE1vZGVsIEludGVnZXIKbTIgPSBWYXJpYW50IFsoZGF5MSwgMSksIChkYXkyLCAyKSwgKGRheTQsIDQpLCAoZGF5NiwgNildIDo6IE1vZGVsIEludGVnZXIKCihWYXJpYW50IGEpICYrIChWYXJpYW50IGIpID0KCVZhcmlhbnQgJCBzbmQgJCBtYXBBY2N1bUwgKFxyIChkLCBrKSAtPiBsZXQgcicgPSByICsgayBpbiAocicsIChkLCByJykpKSAwCgkJJCB0b0xpc3QgJCBNYXAudW5pb25XaXRoICgrKQoJCQkoTWFwLmZyb21EaXN0aW5jdEFzY0xpc3QgYSkKCQkJKE1hcC5mcm9tRGlzdGluY3RBc2NMaXN0IGIpCgptYWluID0gcHJpbnQgJCBtMSAmKyBtMg==
Variant [(1987-10-17,2),(1987-10-18,4),(1987-10-19,7),(1987-10-20,11),(1987-10-21,16),(1987-10-22,22)]