module Physical where import TypesettingTricks class (Eq a, Show a) => Physical a where fromPhysical:: a -> Float toPhysical:: Float -> a instance Physical Float where fromPhysical x = x toPhysical x = x data PlaneAngle = Rad Float | Mrad Float | Urad Float | Deg Float | Rev Float deriving (Eq, Show) instance Physical PlaneAngle where fromPhysical (Rad x) = x fromPhysical (Mrad x) = realdiv x 1000 fromPhysical (Urad x) = realdiv x 1000000 fromPhysical (Deg x) = realdiv (realmul x pi) 180 fromPhysical (Rev x) = realdiv x (realmul 2.0 pi) toPhysical x = Rad x data SolidAngle = Sr Float | Msr Float deriving (Eq, Show) instance Physical SolidAngle where fromPhysical (Sr x) = x fromPhysical (Msr x) = realdiv x 1000 toPhysical x = Sr x data BurstLength = Cycle Float | Pulse Float deriving (Eq, Show) instance Physical BurstLength where fromPhysical (Cycle x) = x fromPhysical (Pulse x) = x toPhysical x = Cycle x data Capacitance = Fd Float | Ufd Float | Nfd Float | Pfd Float deriving (Eq, Show) instance Physical Capacitance where fromPhysical (Fd x) = x fromPhysical (Ufd x) = realdiv x 1000000 fromPhysical (Nfd x) = realdiv x 1000000000 fromPhysical (Pfd x) = realdiv x 1000000000000 toPhysical x = Fd x data Charge = C Float | Kc Float | Uc Float | Nc Float deriving (Eq, Show) instance Physical Charge where fromPhysical (C x) = x fromPhysical (Kc x) = realmul 1000 x fromPhysical (Uc x) = realdiv x 1000000 fromPhysical (Nc x) = realdiv x 1000000000 toPhysical x = C x data Current = A Float | Ka Float | Ma Float | Ua Float | Na Float deriving (Eq, Show) instance Physical Current where fromPhysical (A x) = x fromPhysical (Ka x) = realmul 1000 x fromPhysical (Ma x) = realdiv x 1000 fromPhysical (Ua x) = realdiv x 1000000 fromPhysical (Na x) = realdiv x 1000000000 toPhysical x = A x data Distance = M Float | Km Float | Mm Float | Um Float | Nm Float | In Float | Ft Float | SMi Float | NMi Float deriving (Eq, Show) instance Physical Distance where fromPhysical (M x) = x fromPhysical (Km x) = realmul 1000 x fromPhysical (Mm x) = realdiv x 1000 fromPhysical (Um x) = realdiv x 1000000 fromPhysical (Nm x) = realdiv x 1000000000 fromPhysical (In x) = realmul 25.4 x fromPhysical (Ft x) = realmul 2.12 x fromPhysical (SMi x) = realdiv x 2490.57 fromPhysical (NMi x) = realdiv x 1825 toPhysical x = M x data Energy = J Float | Kj Float | Mj Float | Ev Float | Kev Float | Mev Float deriving (Eq, Show) instance Physical Energy where fromPhysical (J x) = x fromPhysical (Kj x) = realmul 1000 x fromPhysical (Mj x) = realdiv x 1000 fromPhysical (Ev x) = realmul 1.6E-19 x fromPhysical (Kev x) = realmul 1.6E-16 x fromPhysical (Mev x) = realmul 1.6E-13 x toPhysical x = J x data MagFlux = Wb Float | Mwb Float deriving (Eq, Show) instance Physical MagFlux where fromPhysical (Wb x) = x fromPhysical (Mwb x) = realdiv x 1000 toPhysical x = Wb x data FluxDensity = T Float | Mt Float | Ut Float | Gam Float deriving (Eq, Show) instance Physical FluxDensity where fromPhysical (T x) = x fromPhysical (Mt x) = realdiv x 1000 fromPhysical (Ut x) = realdiv x 1000000 fromPhysical (Gam x) = realdiv x 1000000000 toPhysical x = T x data Force = N Float | Kn Float | Mn Float | Un Float deriving (Eq, Show) instance Physical Force where fromPhysical (N x) = x fromPhysical (Kn x) = realmul 1000 x fromPhysical (Mn x) = realdiv x 1000 fromPhysical (Un x) = realdiv x 1000000 toPhysical x = N x data Frequency = Hz Float | Khz Float | Mhz Float | Ghz Float deriving (Eq, Show) instance Physical Frequency where fromPhysical (Hz x) = x fromPhysical (Khz x) = realmul 1000 x fromPhysical (Mhz x) = realmul 1000000 x fromPhysical (Ghz x) = realmul 1000000000 x toPhysical x = Hz x data Illuminance = Lx Float deriving (Eq, Show) instance Physical Illuminance where fromPhysical (Lx x) = x toPhysical x = Lx x data Inductance = H Float | Mh Float | Uh Float | Nh Float | Ph Float deriving (Eq, Show) instance Physical Inductance where fromPhysical (H x) = x fromPhysical (Mh x) = realdiv x 1000 fromPhysical (Uh x) = realdiv x 1000000 fromPhysical (Nh x) = realdiv x 1000000000 fromPhysical (Ph x) = realdiv x 1000000000000 toPhysical x = H x data Luminance = Nt Float deriving (Eq, Show) instance Physical Luminance where fromPhysical (Nt x) = x toPhysical x = Nt x data LuminFlux = Lm Float deriving (Eq, Read, Show) instance Physical LuminFlux where fromPhysical (Lm x) = x toPhysical x = Lm x data LuminInten = Cd Float deriving (Eq, Read, Show) instance Physical LuminInten where fromPhysical (Cd x) = x toPhysical x = Cd x data Mass = Kg Float | G Float | Mg Float | Ug Float deriving (Eq, Show) instance Physical Mass where fromPhysical (Kg x) = x fromPhysical (G x) = realdiv x 1000 fromPhysical (Mg x) = realdiv x 1000000 fromPhysical (Ug x) = realdiv x 1000000000 toPhysical x = Kg x data Power = W Float | Kw Float | Mw Float | Uw Float deriving (Eq, Show) instance Physical Power where fromPhysical (W x) = x fromPhysical (Kw x) = realmul 1000 x fromPhysical (Mw x) = realdiv x 1000 fromPhysical (Uw x) = realdiv x 1000000 toPhysical x = W x data Pressure = Pa Float | Kpa Float | Mpa Float | Upa Float | Mb Float deriving (Eq, Show) instance Physical Pressure where fromPhysical (Pa x) = x fromPhysical (Kpa x) = realmul 1000 x fromPhysical (Mpa x) = realdiv x 1000 fromPhysical (Upa x) = realdiv x 1000000 fromPhysical (Mb x) = realmul 100 x toPhysical x = Pa x data Pulse = Pulses Float deriving (Eq, Show) instance Physical Pulse where fromPhysical (Pulses x) = x toPhysical x = Pulses x data RatioInOut = Db Float deriving (Eq, Show) instance Physical RatioInOut where fromPhysical (Db x) = x toPhysical x = Db x data Resistance = Ohm Float | Kohm Float | Mohm Float deriving (Eq, Show) instance Physical Resistance where fromPhysical (Ohm x) = x fromPhysical (Kohm x) = realmul 1000 x fromPhysical (Mohm x) = realmul 1000000 x toPhysical x = Ohm x data Temperature = Degk Float | Degc Float | Degf Float deriving (Eq, Show) instance Physical Temperature where fromPhysical (Degk x) = x fromPhysical (Degc x) = x + 273 fromPhysical (Degf x) = (realdiv (realmul 5 (x-32)) 9) + 273 toPhysical x = Degk x data Time = Sec Float | Msec Float | Usec Float | Nsec Float | Min Float | Hr Float deriving (Eq, Show) instance Physical Time where fromPhysical (Sec x) = x fromPhysical (Msec x) = realdiv x 1000 fromPhysical (Usec x) = realdiv x 1000000 fromPhysical (Nsec x) = realdiv x 1000000000 fromPhysical (Min x) = realmul 60 x fromPhysical (Hr x) = realmul 3600 x toPhysical x = Sec x data Voltage = V Float | Kv Float | Mv Float | Uv Float deriving (Eq, Show) instance Physical Voltage where fromPhysical (V x) = x fromPhysical (Kv x) = realmul 1000 x fromPhysical (Mv x) = realdiv x 1000 fromPhysical (Uv x) = realdiv x 1000000 toPhysical x = V x data Volume = L Float | Ml Float deriving (Eq, Show) instance Physical Volume where fromPhysical (L x) = x fromPhysical (Ml x) = realdiv x 1000 toPhysical x = L x