0 | module Text.Smiles.AtomType
3 | import Text.Smiles.Types
10 | 0 SmilesAtomAT : Type
11 | SmilesAtomAT = Atom AromIsotope Charge () () HCount AtomType Chirality ()
14 | Cast SmilesAtomAT Elem where
15 | cast a = cast a.elem
18 | Cast SmilesAtomAT Hybridization where
19 | cast a = cast a.type.hybridization
24 | 0 SmilesGraphAT : Type
25 | SmilesGraphAT = Graph SmilesBond SmilesAtomAT
31 | sbToBonds : SmilesBond -> Bonds
32 | sbToBonds Sngl = BS 1 0 0
33 | sbToBonds Arom = BS 0 0 0
34 | sbToBonds Dbl = BS 0 1 0
35 | sbToBonds Trpl = BS 0 0 1
36 | sbToBonds Quad = BS 0 0 0
37 | sbToBonds FW = BS 1 0 0
38 | sbToBonds BW = BS 1 0 0
45 | adjNitrogen2 : Bonds -> Bonds
48 | then {single $= (+ 2)} bs
49 | else {single := 1, double $= S} bs
52 | addAromaticBonds : Elem -> Nat -> Bonds -> Bonds
53 | addAromaticBonds _ 0 bs = bs
54 | addAromaticBonds C 2 bs =
56 | then {single $= (+ 2)} bs
57 | else {single $= S, double $= S} bs
58 | addAromaticBonds C 3 bs = {single $= (+2), double $= S} bs
59 | addAromaticBonds N 2 bs = adjNitrogen2 bs
60 | addAromaticBonds P 2 bs = adjNitrogen2 bs
61 | addAromaticBonds As 2 bs = adjNitrogen2 bs
62 | addAromaticBonds _ n bs = {single $= (+n)} bs
66 | calcAT : Fin k -> Adj k SmilesBond SmilesAtom -> SmilesAtomAT
67 | calcAT n (A at@(SubsetAtom e a) ns) =
68 | let iso := MkAI e Nothing a
69 | arom := count (Arom ==) ns
70 | bonds := addAromaticBonds e arom $
foldMap sbToBonds ns
71 | (h,tpe) := atomTypeAndHydrogens e NoRadical 0 bonds
72 | in MkAtom iso 0 () () h tpe None ()
74 | calcAT n (A (Bracket x) ns) =
75 | let e := cast {to = Elem} x.elem
76 | arom := count (Arom ==) ns
78 | addAromaticBonds e arom
79 | . {single $= (+ cast x.hydrogen.value)}
80 | $
foldMap sbToBonds ns
81 | in {type := exactAtomType e NoRadical x.charge bs} x
84 | perceiveSmilesAtomTypes : SmilesGraph -> SmilesGraphAT
85 | perceiveSmilesAtomTypes (G o g) = G o $
mapWithCtxt calcAT g