5 | import Data.Maybe.Upper
7 | import Derive.Prelude
9 | %language ElabReflection
42 | record Atom (el,chg,pos,rad,hyd,tpe,chr,lbl : Type) where
53 | %runElab derive "Atom" [Show,Eq]
56 | Functor (Atom e c p r h t ch) where
57 | map f = {label $= f}
60 | Foldable (Atom e c p r h t ch) where
61 | foldr f acc at = f at.label acc
62 | foldl f acc at = f acc at.label
64 | foldlM f acc at = f acc at.label
65 | toList at = [at.label]
66 | foldMap f at = f at.label
69 | Traversable (Atom e c p r h t ch) where
70 | traverse f (MkAtom e c p r h t ch l) = MkAtom e c p r h t ch <$> f l
73 | Cast e Elem => Cast (Atom e c p r NoH t ch l) Formula where
74 | cast a = singleton (cast a.elem) 1
77 | Cast e Elem => Cast (Atom e c p r HCount t ch l) Formula where
78 | cast a = singleton (cast a.elem) 1 <+> singleton H (cast a.hydrogen.value)
81 | interface HasMolecularMass a where
82 | molecularMass : a -> MolecularMass
83 | exactMolecularMass : a -> MolecularMass
86 | HasMolecularMass NoH where
87 | molecularMass _ = 0.0
88 | exactMolecularMass _ = 0.0
91 | HasMolecularMass HCount where
92 | molecularMass m = multMolecularMass (cast m.value) (cast $
mass H)
93 | exactMolecularMass m = multMolecularMass (cast m.value) (cast $
exactMass H)
96 | HasMolarMass e => HasMolecularMass h => HasMolecularMass (Atom e c p r h t ch x) where
97 | molecularMass a = cast (mass a.elem) <+> molecularMass a.hydrogen
98 | exactMolecularMass a =
99 | cast (exactMass a.elem) <+> exactMolecularMass a.hydrogen