0 | module Text.Smiles.Types
4 | import Derive.Prelude
5 | import Derive.Refined
8 | %language ElabReflection
20 | {auto 0 prf : FromTo 1 20 value}
23 | Interpolation TBIx where
24 | interpolate = show . value
27 | %runElab derive "TBIx" [Show,Eq,Ord,RefinedInteger]
31 | values = mapMaybe refineTBIx [1..20]
39 | {auto 0 prf : FromTo 1 20 value}
42 | Interpolation OHIx where
43 | interpolate = show . value
46 | %runElab derive "OHIx" [Show,Eq,Ord,RefinedInteger]
50 | values = mapMaybe refineOHIx [1..20]
55 | None | CW | CCW | TH1 | TH2 | AL1 | AL2 | SP1 | SP2 | SP3 | TB TBIx | OH OHIx
58 | Interpolation Chirality where
59 | interpolate None = ""
60 | interpolate CW = "@@"
61 | interpolate CCW = "@"
62 | interpolate TH1 = "@TH1"
63 | interpolate TH2 = "@TH2"
64 | interpolate AL1 = "@AL1"
65 | interpolate AL2 = "@AL2"
66 | interpolate SP1 = "@SP1"
67 | interpolate SP2 = "@SP2"
68 | interpolate SP3 = "@SP3"
69 | interpolate (TB x) = "@TB\{x}"
70 | interpolate (OH x) = "@OH\{x}"
72 | %runElab derive "Chirality" [Ord,Eq,Show,Finite]
82 | data ValidSubset : Elem -> Bool -> Type where
83 | VB : ValidSubset B b
84 | VC : ValidSubset C b
85 | VN : ValidSubset N b
86 | VO : ValidSubset O b
87 | VF : ValidSubset F False
88 | VP : ValidSubset P b
89 | VS : ValidSubset S b
90 | VCl : ValidSubset Cl False
91 | VBr : ValidSubset Br False
92 | VI : ValidSubset I False
95 | 0 toValidArom : ValidSubset e b => ValidAromatic e b
96 | toValidArom {b = False} = VARest
97 | toValidArom {b = True} @{VB} = VAB
98 | toValidArom {b = True} @{VC} = VAC
99 | toValidArom {b = True} @{VN} = VAN
100 | toValidArom {b = True} @{VO} = VAO
101 | toValidArom {b = True} @{VP} = VAP
102 | toValidArom {b = True} @{VS} = VAS
105 | data SmilesAtom : Type where
109 | -> {auto 0 prf : ValidSubset elem arom}
111 | Bracket : Atom AromIsotope Charge () () HCount () Chirality () -> SmilesAtom
113 | %runElab derive "SmilesAtom" [Show,Eq]
116 | subset : List SmilesAtom
118 | [ SubsetAtom B False, SubsetAtom C True
119 | , SubsetAtom C False, SubsetAtom B True
120 | , SubsetAtom N False, SubsetAtom N True
121 | , SubsetAtom O False, SubsetAtom O True
122 | , SubsetAtom P False, SubsetAtom P True
123 | , SubsetAtom S False, SubsetAtom S True
124 | , SubsetAtom F False, SubsetAtom Cl False
125 | , SubsetAtom Br False, SubsetAtom I False
129 | Cast SmilesAtom Elem where
130 | cast (SubsetAtom elem arom) = elem
131 | cast (Bracket x) = cast x.elem
134 | Cast SmilesAtom Isotope where
135 | cast (SubsetAtom elem arom) = MkI elem Nothing
136 | cast (Bracket x) = cast x.elem
139 | Cast SmilesAtom AromIsotope where
140 | cast (SubsetAtom elem arom) = MkAI elem Nothing arom
141 | cast (Bracket x) = x.elem
144 | Cast SmilesAtom AromElem where
145 | cast = cast . cast {to = AromIsotope}
148 | bracket : AromIsotope -> Chirality -> HCount -> Charge -> SmilesAtom
149 | bracket a c h ch = Bracket (MkAtom a ch () () h () c ())
152 | isArom : SmilesAtom -> Bool
153 | isArom (SubsetAtom _ a) = a
154 | isArom (Bracket a) = a.elem.arom
157 | aromElem : Elem -> Bool -> String
158 | aromElem e True = toLower $
symbol e
159 | aromElem e False = symbol e
162 | encodeCharge : Charge -> String
163 | encodeCharge 0 = ""
164 | encodeCharge 1 = "+"
165 | encodeCharge (-
1) = "-"
166 | encodeCharge v = if v.value > 0 then "+\{v}" else "\{v}"
169 | encodeH : HCount -> String
172 | encodeH n = "H\{n}"
174 | encodeElem : Elem -> Bool -> String
175 | encodeElem e True = toLower $
Elem.symbol e
176 | encodeElem e False = symbol e
179 | encodeAtom : SmilesAtom -> String
180 | encodeAtom (SubsetAtom e b) = encodeElem e b
181 | encodeAtom (Bracket $
MkAtom (MkAI e mn ar) chrg () () h () ch ()) =
182 | let mns := maybe "" (show . value) mn
183 | in "[\{mns}\{encodeElem e ar}\{ch}\{encodeH h}\{encodeCharge chrg}]"
186 | aromIsotope : Maybe MassNr -> AromElem -> AromIsotope
187 | aromIsotope m (MkAE e a) = MkAI e m a
190 | Interpolation SmilesAtom where
191 | interpolate = encodeAtom
200 | record RingNr where
201 | constructor MkRingNr
203 | 0 prf : value <= 99
206 | Interpolation RingNr where
207 | interpolate n = if n.value >= 10 then "%\{show n.value}" else show n.value
210 | %runElab derive "RingNr" [Show,Eq,Ord,RefinedInteger]
213 | Finite RingNr where
214 | values = mapMaybe refineRingNr [0..99]
218 | data SmilesBond = Sngl | Arom | Dbl | Trpl | Quad | FW | BW
221 | Cast SmilesBond BondOrder where
227 | Interpolation SmilesBond where
228 | interpolate Sngl = "-"
229 | interpolate Arom = ":"
230 | interpolate Dbl = "="
231 | interpolate Trpl = "#"
232 | interpolate Quad = "$"
233 | interpolate FW = "/"
234 | interpolate BW = "\\"
236 | %runElab derive "SmilesBond" [Show,Eq,Ord, Finite]
242 | bond : Maybe SmilesBond
244 | %runElab derive "Ring" [Show,Eq,Finite]
247 | Interpolation Ring where
248 | interpolate (R r (Just b)) = "\{b}\{r}"
249 | interpolate (R r Nothing) = "\{r}"
252 | 0 SmilesGraph : Type
253 | SmilesGraph = Graph SmilesBond SmilesAtom