1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
{-# LANGUAGE StrictData #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Blowup (Ps(..)) where
import Data.Coerce
import Data.Semigroup (Semigroup(..), Last(..))
-- N.B. This was original Data.Semigroup.Option, which was deprecated
newtype Option a = Option (Maybe a)
instance Semigroup a => Semigroup (Option a) where
(<>) = coerce ((<>) :: Maybe a -> Maybe a -> Maybe a)
stimes _ (Option Nothing) = Option Nothing
stimes n (Option (Just a)) = case compare n 0 of
LT -> error "stimes: Option, negative multiplier"
EQ -> Option Nothing
GT -> Option (Just (stimes n a))
-- | @since 4.9.0.0
instance Semigroup a => Monoid (Option a) where
mempty = Option Nothing
data Ps = Ps
{ _p1 :: Maybe Double
, _p2 :: Maybe Double
, _p3 :: Maybe Double
, _p4 :: Maybe Double
, _p5 :: Maybe Double
, _p6 :: Maybe Double
, _p7 :: Maybe Double
, _p8 :: Maybe Double
, _p9 :: Maybe Double
, _p10 :: Maybe Double
, _p11 :: Maybe Double
, _p12 :: Maybe Double
, _p13 :: Maybe Double
, _p14 :: Maybe Double
, _p15 :: Maybe Double
, _p16 :: Maybe Double
, _p17 :: Maybe Double
, _p18 :: Maybe Double
, _p19 :: Maybe Double
, _p20 :: Maybe Double
, _pa :: Maybe (String, String)
}
instance Semigroup Ps where
(<>) (Ps p_1 p_2 p_3 p_4 p_5 p_6 p_7 p_8 p_9
p_10 p_11 p_12 p_13 p_14 p_15 p_16 p_17 p_18 p_19 p_20
pa)
(Ps p_1' p_2' p_3' p_4' p_5' p_6' p_7' p_8' p_9'
p_10' p_11' p_12' p_13' p_14' p_15' p_16' p_17' p_18' p_19' p_20'
pa')
= Ps (f p_1 p_1')
(f p_2 p_2')
(f p_3 p_3')
(f p_4 p_4')
(f p_5 p_5')
(f p_6 p_6')
(f p_7 p_7')
(f p_8 p_8')
(f p_9 p_9')
(f p_10 p_10')
(f p_11 p_11')
(f p_12 p_12')
(f p_13 p_13')
(f p_14 p_14')
(f p_15 p_15')
(f p_16 p_16')
(f p_17 p_17')
(f p_18 p_18')
(f p_19 p_19')
(f p_20 p_20')
(f pa pa')
where
f :: forall a. Maybe a -> Maybe a -> Maybe a
#if defined(COERCE)
f = coerce ((<>) :: Option (Last a) -> Option (Last a) -> Option (Last a))
#else
f _ y@(Just _) = y
f x _ = x
#endif
|