nkl/core/
element.rs

1/// Periodic table chemical element.
2///
3/// # Examples
4///
5/// ```
6/// use nkl::core::Element;
7///
8/// let hydrogen = Element::Hydrogen;
9/// let helium = Element::from_name("Helium").unwrap();
10/// let lithium = Element::from_symbol("Li").unwrap();
11/// let beryllium = Element::from_atomic_number(4).unwrap();
12///
13/// assert_eq!(hydrogen.name(), "Hydrogen");
14/// assert_eq!(hydrogen.symbol(), "H");
15/// assert_eq!(hydrogen.atomic_number(), 1);
16/// assert_eq!(hydrogen.block(), "s");
17/// assert_eq!(hydrogen.period(), 1);
18/// assert_eq!(hydrogen.group(), Some(1));
19/// ```
20///
21/// # Notes
22///
23/// - Chemical element from *Hydrogen* (Z = 1) to *Oganesson* (Z = 118) are included.
24/// - `Element` enum is marked as non exhaustive for future-proofing.
25///
26/// # References
27///
28/// - Holden, Norman E., Coplen, Tyler B., Böhlke, John K., Tarbox, Lauren V., Benefield, Jacqueline,
29///   de Laeter, John R., Mahaffy, Peter G., O’Connor, Glenda, Roth, Etienne, Tepper, Dorothy H.,
30///   Walczyk, Thomas, Wieser, Michael E. and Yoneda, Shigekazu.
31///   *IUPAC Periodic Table of the Elements and Isotopes (IPTEI) for the Education Community (IUPAC Technical Report)*
32///   Pure and Applied Chemistry, vol. 90, no. 12, 2018, pp. 1833-2092.
33///   <https://doi.org/10.1515/pac-2015-0703>
34/// - [IUPAC Periodic Table of the Elements and Isotopes](https://iupac.org/what-we-do/periodic-table-of-elements/)
35/// - [Wikipedia: Periodic Table](https://en.wikipedia.org/wiki/Periodic_table)
36#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
37#[non_exhaustive]
38pub enum Element {
39    /// Hydrogen, symbol='H', atomic number Z=1
40    Hydrogen,
41    /// Helium, symbol='He', atomic number Z=2
42    Helium,
43    /// Lithium, symbol='Li', atomic number Z=3
44    Lithium,
45    /// Beryllium, symbol='Be', atomic number Z=4
46    Beryllium,
47    /// Boron, symbol='B', atomic number Z=5
48    Boron,
49    /// Carbon, symbol='C', atomic number Z=6
50    Carbon,
51    /// Nitrogen, symbol='N', atomic number Z=7
52    Nitrogen,
53    /// Oxygen, symbol='O', atomic number Z=8
54    Oxygen,
55    /// Fluorine, symbol='F', atomic number Z=9
56    Fluorine,
57    /// Neon, symbol='Ne', atomic number Z=10
58    Neon,
59    /// Sodium, symbol='Na', atomic number Z=11
60    Sodium,
61    /// Magnesium, symbol='Mg', atomic number Z=12
62    Magnesium,
63    /// Aluminium, symbol='Al', atomic number Z=13
64    Aluminium,
65    /// Silicon, symbol='Si', atomic number Z=14
66    Silicon,
67    /// Phosphorus, symbol='P', atomic number Z=15
68    Phosphorus,
69    /// Sulfur, symbol='S', atomic number Z=16
70    Sulfur,
71    /// Chlorine, symbol='Cl', atomic number Z=17
72    Chlorine,
73    /// Argon, symbol='Ar', atomic number Z=18
74    Argon,
75    /// Potassium, symbol='K', atomic number Z=19
76    Potassium,
77    /// Calcium, symbol='Ca', atomic number Z=20
78    Calcium,
79    /// Scandium, symbol='Sc', atomic number Z=21
80    Scandium,
81    /// Titanium, symbol='Ti', atomic number Z=22
82    Titanium,
83    /// Vanadium, symbol='V', atomic number Z=23
84    Vanadium,
85    /// Chromium, symbol='Cr', atomic number Z=24
86    Chromium,
87    /// Manganese, symbol='Mn', atomic number Z=25
88    Manganese,
89    /// Iron, symbol='Fe', atomic number Z=26
90    Iron,
91    /// Cobalt, symbol='Co', atomic number Z=27
92    Cobalt,
93    /// Nickel, symbol='Ni', atomic number Z=28
94    Nickel,
95    /// Copper, symbol='Cu', atomic number Z=29
96    Copper,
97    /// Zinc, symbol='Zn', atomic number Z=30
98    Zinc,
99    /// Gallium, symbol='Ga', atomic number Z=31
100    Gallium,
101    /// Germanium, symbol='Ge', atomic number Z=32
102    Germanium,
103    /// Arsenic, symbol='As', atomic number Z=33
104    Arsenic,
105    /// Selenium, symbol='Se', atomic number Z=34
106    Selenium,
107    /// Bromine, symbol='Br', atomic number Z=35
108    Bromine,
109    /// Krypton, symbol='Kr', atomic number Z=36
110    Krypton,
111    /// Rubidium, symbol='Rb', atomic number Z=37
112    Rubidium,
113    /// Strontium, symbol='Sr', atomic number Z=38
114    Strontium,
115    /// Yttrium, symbol='Y', atomic number Z=39
116    Yttrium,
117    /// Zirconium, symbol='Zr', atomic number Z=40
118    Zirconium,
119    /// Niobium, symbol='Nb', atomic number Z=41
120    Niobium,
121    /// Molybdenum, symbol='Mo', atomic number Z=42
122    Molybdenum,
123    /// Technetium, symbol='Tc', atomic number Z=43
124    Technetium,
125    /// Ruthenium, symbol='Ru', atomic number Z=44
126    Ruthenium,
127    /// Rhodium, symbol='Rh', atomic number Z=45
128    Rhodium,
129    /// Palladium, symbol='Pd', atomic number Z=46
130    Palladium,
131    /// Silver, symbol='Ag', atomic number Z=47
132    Silver,
133    /// Cadmium, symbol='Cd', atomic number Z=48
134    Cadmium,
135    /// Indium, symbol='In', atomic number Z=49
136    Indium,
137    /// Tin, symbol='Sn', atomic number Z=50
138    Tin,
139    /// Antimony, symbol='Sb', atomic number Z=51
140    Antimony,
141    /// Tellurium, symbol='Te', atomic number Z=52
142    Tellurium,
143    /// Iodine, symbol='I', atomic number Z=53
144    Iodine,
145    /// Xenon, symbol='Xe', atomic number Z=54
146    Xenon,
147    /// Caesium, symbol='Cs', atomic number Z=55
148    Caesium,
149    /// Barium, symbol='Ba', atomic number Z=56
150    Barium,
151    /// Lanthanum, symbol='La', atomic number Z=57
152    Lanthanum,
153    /// Cerium, symbol='Ce', atomic number Z=58
154    Cerium,
155    /// Praseodymium, symbol='Pr', atomic number Z=59
156    Praseodymium,
157    /// Neodymium, symbol='Nd', atomic number Z=60
158    Neodymium,
159    /// Promethium, symbol='Pm', atomic number Z=61
160    Promethium,
161    /// Samarium, symbol='Sm', atomic number Z=62
162    Samarium,
163    /// Europium, symbol='Eu', atomic number Z=63
164    Europium,
165    /// Gadolinium, symbol='Gd', atomic number Z=64
166    Gadolinium,
167    /// Terbium, symbol='Tb', atomic number Z=65
168    Terbium,
169    /// Dysprosium, symbol='Dy', atomic number Z=66
170    Dysprosium,
171    /// Holmium, symbol='Ho', atomic number Z=67
172    Holmium,
173    /// Erbium, symbol='Er', atomic number Z=68
174    Erbium,
175    /// Thulium, symbol='Tm', atomic number Z=69
176    Thulium,
177    /// Ytterbium, symbol='Yb', atomic number Z=70
178    Ytterbium,
179    /// Lutetium, symbol='Lu', atomic number Z=71
180    Lutetium,
181    /// Hafnium, symbol='Hf', atomic number Z=72
182    Hafnium,
183    /// Tantalum, symbol='Ta', atomic number Z=73
184    Tantalum,
185    /// Tungsten, symbol='W', atomic number Z=74
186    Tungsten,
187    /// Rhenium, symbol='Re', atomic number Z=75
188    Rhenium,
189    /// Osmium, symbol='Os', atomic number Z=76
190    Osmium,
191    /// Iridium, symbol='Ir', atomic number Z=77
192    Iridium,
193    /// Platinum, symbol='Pt', atomic number Z=78
194    Platinum,
195    /// Gold, symbol='Au', atomic number Z=79
196    Gold,
197    /// Mercury, symbol='Hg', atomic number Z=80
198    Mercury,
199    /// Thallium, symbol='Tl', atomic number Z=81
200    Thallium,
201    /// Lead, symbol='Pb', atomic number Z=82
202    Lead,
203    /// Bismuth, symbol='Bi', atomic number Z=83
204    Bismuth,
205    /// Polonium, symbol='Po', atomic number Z=84
206    Polonium,
207    /// Astatine, symbol='At', atomic number Z=85
208    Astatine,
209    /// Radon, symbol='Rn', atomic number Z=86
210    Radon,
211    /// Francium, symbol='Fr', atomic number Z=87
212    Francium,
213    /// Radium, symbol='Ra', atomic number Z=88
214    Radium,
215    /// Actinium, symbol='Ac', atomic number Z=89
216    Actinium,
217    /// Thorium, symbol='Th', atomic number Z=90
218    Thorium,
219    /// Protactinium, symbol='Pa', atomic number Z=91
220    Protactinium,
221    /// Uranium, symbol='U', atomic number Z=92
222    Uranium,
223    /// Neptunium, symbol='Np', atomic number Z=93
224    Neptunium,
225    /// Plutonium, symbol='Pu', atomic number Z=94
226    Plutonium,
227    /// Americium, symbol='Am', atomic number Z=95
228    Americium,
229    /// Curium, symbol='Cm', atomic number Z=96
230    Curium,
231    /// Berkelium, symbol='Bk', atomic number Z=97
232    Berkelium,
233    /// Californium, symbol='Cf', atomic number Z=98
234    Californium,
235    /// Einsteinium, symbol='Es', atomic number Z=99
236    Einsteinium,
237    /// Fermium, symbol='Fm', atomic number Z=100
238    Fermium,
239    /// Mendelevium, symbol='Md', atomic number Z=101
240    Mendelevium,
241    /// Nobelium, symbol='No', atomic number Z=102
242    Nobelium,
243    /// Lawrencium, symbol='Lr', atomic number Z=103
244    Lawrencium,
245    /// Rutherfordium, symbol='Rf', atomic number Z=104
246    Rutherfordium,
247    /// Dubnium, symbol='Db', atomic number Z=105
248    Dubnium,
249    /// Seaborgium, symbol='Sg', atomic number Z=106
250    Seaborgium,
251    /// Bohrium, symbol='Bh', atomic number Z=107
252    Bohrium,
253    /// Hassium, symbol='Hs', atomic number Z=108
254    Hassium,
255    /// Meitnerium, symbol='Mt', atomic number Z=109
256    Meitnerium,
257    /// Darmstadtium, symbol='Ds', atomic number Z=110
258    Darmstadtium,
259    /// Roentgenium, symbol='Rg', atomic number Z=111
260    Roentgenium,
261    /// Copernicium, symbol='Cn', atomic number Z=112
262    Copernicium,
263    /// Nihonium, symbol='Nh', atomic number Z=113
264    Nihonium,
265    /// Flerovium, symbol='Fl', atomic number Z=114
266    Flerovium,
267    /// Moscovium, symbol='Mc', atomic number Z=115
268    Moscovium,
269    /// Livermorium, symbol='Lv', atomic number Z=116
270    Livermorium,
271    /// Tennessine, symbol='Ts', atomic number Z=117
272    Tennessine,
273    /// Oganesson, symbol='Og', atomic number Z=118
274    Oganesson,
275}
276
277impl Element {
278    /// Maximum atomic number.
279    pub(crate) const MAX_ATOMIC_NUMBER: u32 = 118;
280
281    /// Elements array for iterator.
282    const ELEMENTS: [Self; 118] = [
283        Self::Hydrogen,
284        Self::Helium,
285        Self::Lithium,
286        Self::Beryllium,
287        Self::Boron,
288        Self::Carbon,
289        Self::Nitrogen,
290        Self::Oxygen,
291        Self::Fluorine,
292        Self::Neon,
293        Self::Sodium,
294        Self::Magnesium,
295        Self::Aluminium,
296        Self::Silicon,
297        Self::Phosphorus,
298        Self::Sulfur,
299        Self::Chlorine,
300        Self::Argon,
301        Self::Potassium,
302        Self::Calcium,
303        Self::Scandium,
304        Self::Titanium,
305        Self::Vanadium,
306        Self::Chromium,
307        Self::Manganese,
308        Self::Iron,
309        Self::Cobalt,
310        Self::Nickel,
311        Self::Copper,
312        Self::Zinc,
313        Self::Gallium,
314        Self::Germanium,
315        Self::Arsenic,
316        Self::Selenium,
317        Self::Bromine,
318        Self::Krypton,
319        Self::Rubidium,
320        Self::Strontium,
321        Self::Yttrium,
322        Self::Zirconium,
323        Self::Niobium,
324        Self::Molybdenum,
325        Self::Technetium,
326        Self::Ruthenium,
327        Self::Rhodium,
328        Self::Palladium,
329        Self::Silver,
330        Self::Cadmium,
331        Self::Indium,
332        Self::Tin,
333        Self::Antimony,
334        Self::Tellurium,
335        Self::Iodine,
336        Self::Xenon,
337        Self::Caesium,
338        Self::Barium,
339        Self::Lanthanum,
340        Self::Cerium,
341        Self::Praseodymium,
342        Self::Neodymium,
343        Self::Promethium,
344        Self::Samarium,
345        Self::Europium,
346        Self::Gadolinium,
347        Self::Terbium,
348        Self::Dysprosium,
349        Self::Holmium,
350        Self::Erbium,
351        Self::Thulium,
352        Self::Ytterbium,
353        Self::Lutetium,
354        Self::Hafnium,
355        Self::Tantalum,
356        Self::Tungsten,
357        Self::Rhenium,
358        Self::Osmium,
359        Self::Iridium,
360        Self::Platinum,
361        Self::Gold,
362        Self::Mercury,
363        Self::Thallium,
364        Self::Lead,
365        Self::Bismuth,
366        Self::Polonium,
367        Self::Astatine,
368        Self::Radon,
369        Self::Francium,
370        Self::Radium,
371        Self::Actinium,
372        Self::Thorium,
373        Self::Protactinium,
374        Self::Uranium,
375        Self::Neptunium,
376        Self::Plutonium,
377        Self::Americium,
378        Self::Curium,
379        Self::Berkelium,
380        Self::Californium,
381        Self::Einsteinium,
382        Self::Fermium,
383        Self::Mendelevium,
384        Self::Nobelium,
385        Self::Lawrencium,
386        Self::Rutherfordium,
387        Self::Dubnium,
388        Self::Seaborgium,
389        Self::Bohrium,
390        Self::Hassium,
391        Self::Meitnerium,
392        Self::Darmstadtium,
393        Self::Roentgenium,
394        Self::Copernicium,
395        Self::Nihonium,
396        Self::Flerovium,
397        Self::Moscovium,
398        Self::Livermorium,
399        Self::Tennessine,
400        Self::Oganesson,
401    ];
402
403    /// Returns `Element` corresponding to specified `name` (case insensitive).
404    ///
405    /// # Returns
406    ///
407    /// - `Some(element)` if `name` is a standard element name (case insensitive)
408    /// - `None` if `name` is **not** a standard element name
409    ///
410    /// # Examples
411    ///
412    /// ```
413    /// use nkl::core::Element;
414    ///
415    /// assert_eq!(Element::from_name("Hydrogen"), Some(Element::Hydrogen));
416    /// ```
417    pub fn from_name(name: &str) -> Option<Self> {
418        match name.to_ascii_lowercase().as_str() {
419            "hydrogen" => Some(Self::Hydrogen),
420            "helium" => Some(Self::Helium),
421            "lithium" => Some(Self::Lithium),
422            "beryllium" => Some(Self::Beryllium),
423            "boron" => Some(Self::Boron),
424            "carbon" => Some(Self::Carbon),
425            "nitrogen" => Some(Self::Nitrogen),
426            "oxygen" => Some(Self::Oxygen),
427            "fluorine" => Some(Self::Fluorine),
428            "neon" => Some(Self::Neon),
429            "sodium" => Some(Self::Sodium),
430            "magnesium" => Some(Self::Magnesium),
431            "aluminium" => Some(Self::Aluminium),
432            "silicon" => Some(Self::Silicon),
433            "phosphorus" => Some(Self::Phosphorus),
434            "sulfur" => Some(Self::Sulfur),
435            "chlorine" => Some(Self::Chlorine),
436            "argon" => Some(Self::Argon),
437            "potassium" => Some(Self::Potassium),
438            "calcium" => Some(Self::Calcium),
439            "scandium" => Some(Self::Scandium),
440            "titanium" => Some(Self::Titanium),
441            "vanadium" => Some(Self::Vanadium),
442            "chromium" => Some(Self::Chromium),
443            "manganese" => Some(Self::Manganese),
444            "iron" => Some(Self::Iron),
445            "cobalt" => Some(Self::Cobalt),
446            "nickel" => Some(Self::Nickel),
447            "copper" => Some(Self::Copper),
448            "zinc" => Some(Self::Zinc),
449            "gallium" => Some(Self::Gallium),
450            "germanium" => Some(Self::Germanium),
451            "arsenic" => Some(Self::Arsenic),
452            "selenium" => Some(Self::Selenium),
453            "bromine" => Some(Self::Bromine),
454            "krypton" => Some(Self::Krypton),
455            "rubidium" => Some(Self::Rubidium),
456            "strontium" => Some(Self::Strontium),
457            "yttrium" => Some(Self::Yttrium),
458            "zirconium" => Some(Self::Zirconium),
459            "niobium" => Some(Self::Niobium),
460            "molybdenum" => Some(Self::Molybdenum),
461            "technetium" => Some(Self::Technetium),
462            "ruthenium" => Some(Self::Ruthenium),
463            "rhodium" => Some(Self::Rhodium),
464            "palladium" => Some(Self::Palladium),
465            "silver" => Some(Self::Silver),
466            "cadmium" => Some(Self::Cadmium),
467            "indium" => Some(Self::Indium),
468            "tin" => Some(Self::Tin),
469            "antimony" => Some(Self::Antimony),
470            "tellurium" => Some(Self::Tellurium),
471            "iodine" => Some(Self::Iodine),
472            "xenon" => Some(Self::Xenon),
473            "caesium" => Some(Self::Caesium),
474            "barium" => Some(Self::Barium),
475            "lanthanum" => Some(Self::Lanthanum),
476            "cerium" => Some(Self::Cerium),
477            "praseodymium" => Some(Self::Praseodymium),
478            "neodymium" => Some(Self::Neodymium),
479            "promethium" => Some(Self::Promethium),
480            "samarium" => Some(Self::Samarium),
481            "europium" => Some(Self::Europium),
482            "gadolinium" => Some(Self::Gadolinium),
483            "terbium" => Some(Self::Terbium),
484            "dysprosium" => Some(Self::Dysprosium),
485            "holmium" => Some(Self::Holmium),
486            "erbium" => Some(Self::Erbium),
487            "thulium" => Some(Self::Thulium),
488            "ytterbium" => Some(Self::Ytterbium),
489            "lutetium" => Some(Self::Lutetium),
490            "hafnium" => Some(Self::Hafnium),
491            "tantalum" => Some(Self::Tantalum),
492            "tungsten" => Some(Self::Tungsten),
493            "rhenium" => Some(Self::Rhenium),
494            "osmium" => Some(Self::Osmium),
495            "iridium" => Some(Self::Iridium),
496            "platinum" => Some(Self::Platinum),
497            "gold" => Some(Self::Gold),
498            "mercury" => Some(Self::Mercury),
499            "thallium" => Some(Self::Thallium),
500            "lead" => Some(Self::Lead),
501            "bismuth" => Some(Self::Bismuth),
502            "polonium" => Some(Self::Polonium),
503            "astatine" => Some(Self::Astatine),
504            "radon" => Some(Self::Radon),
505            "francium" => Some(Self::Francium),
506            "radium" => Some(Self::Radium),
507            "actinium" => Some(Self::Actinium),
508            "thorium" => Some(Self::Thorium),
509            "protactinium" => Some(Self::Protactinium),
510            "uranium" => Some(Self::Uranium),
511            "neptunium" => Some(Self::Neptunium),
512            "plutonium" => Some(Self::Plutonium),
513            "americium" => Some(Self::Americium),
514            "curium" => Some(Self::Curium),
515            "berkelium" => Some(Self::Berkelium),
516            "californium" => Some(Self::Californium),
517            "einsteinium" => Some(Self::Einsteinium),
518            "fermium" => Some(Self::Fermium),
519            "mendelevium" => Some(Self::Mendelevium),
520            "nobelium" => Some(Self::Nobelium),
521            "lawrencium" => Some(Self::Lawrencium),
522            "rutherfordium" => Some(Self::Rutherfordium),
523            "dubnium" => Some(Self::Dubnium),
524            "seaborgium" => Some(Self::Seaborgium),
525            "bohrium" => Some(Self::Bohrium),
526            "hassium" => Some(Self::Hassium),
527            "meitnerium" => Some(Self::Meitnerium),
528            "darmstadtium" => Some(Self::Darmstadtium),
529            "roentgenium" => Some(Self::Roentgenium),
530            "copernicium" => Some(Self::Copernicium),
531            "nihonium" => Some(Self::Nihonium),
532            "flerovium" => Some(Self::Flerovium),
533            "moscovium" => Some(Self::Moscovium),
534            "livermorium" => Some(Self::Livermorium),
535            "tennessine" => Some(Self::Tennessine),
536            "oganesson" => Some(Self::Oganesson),
537            _ => None,
538        }
539    }
540
541    /// Returns `Element` corresponding to specified symbol.
542    ///
543    /// # Returns
544    ///
545    /// - `Some(element)` if `symbol` is a standard element symbol (case insensitive)
546    /// - `None` if `symbol` is **not** a standard element symbol
547    ///
548    /// # Examples
549    ///
550    /// ```
551    /// use nkl::core::Element;
552    ///
553    /// assert_eq!(Element::from_symbol("H"), Some(Element::Hydrogen));
554    /// ```
555    pub fn from_symbol(symbol: &str) -> Option<Self> {
556        match symbol.to_ascii_lowercase().as_str() {
557            "h" => Some(Self::Hydrogen),
558            "he" => Some(Self::Helium),
559            "li" => Some(Self::Lithium),
560            "be" => Some(Self::Beryllium),
561            "b" => Some(Self::Boron),
562            "c" => Some(Self::Carbon),
563            "n" => Some(Self::Nitrogen),
564            "o" => Some(Self::Oxygen),
565            "f" => Some(Self::Fluorine),
566            "ne" => Some(Self::Neon),
567            "na" => Some(Self::Sodium),
568            "mg" => Some(Self::Magnesium),
569            "al" => Some(Self::Aluminium),
570            "si" => Some(Self::Silicon),
571            "p" => Some(Self::Phosphorus),
572            "s" => Some(Self::Sulfur),
573            "cl" => Some(Self::Chlorine),
574            "ar" => Some(Self::Argon),
575            "k" => Some(Self::Potassium),
576            "ca" => Some(Self::Calcium),
577            "sc" => Some(Self::Scandium),
578            "ti" => Some(Self::Titanium),
579            "v" => Some(Self::Vanadium),
580            "cr" => Some(Self::Chromium),
581            "mn" => Some(Self::Manganese),
582            "fe" => Some(Self::Iron),
583            "co" => Some(Self::Cobalt),
584            "ni" => Some(Self::Nickel),
585            "cu" => Some(Self::Copper),
586            "zn" => Some(Self::Zinc),
587            "ga" => Some(Self::Gallium),
588            "ge" => Some(Self::Germanium),
589            "as" => Some(Self::Arsenic),
590            "se" => Some(Self::Selenium),
591            "br" => Some(Self::Bromine),
592            "kr" => Some(Self::Krypton),
593            "rb" => Some(Self::Rubidium),
594            "sr" => Some(Self::Strontium),
595            "y" => Some(Self::Yttrium),
596            "zr" => Some(Self::Zirconium),
597            "nb" => Some(Self::Niobium),
598            "mo" => Some(Self::Molybdenum),
599            "tc" => Some(Self::Technetium),
600            "ru" => Some(Self::Ruthenium),
601            "rh" => Some(Self::Rhodium),
602            "pd" => Some(Self::Palladium),
603            "ag" => Some(Self::Silver),
604            "cd" => Some(Self::Cadmium),
605            "in" => Some(Self::Indium),
606            "sn" => Some(Self::Tin),
607            "sb" => Some(Self::Antimony),
608            "te" => Some(Self::Tellurium),
609            "i" => Some(Self::Iodine),
610            "xe" => Some(Self::Xenon),
611            "cs" => Some(Self::Caesium),
612            "ba" => Some(Self::Barium),
613            "la" => Some(Self::Lanthanum),
614            "ce" => Some(Self::Cerium),
615            "pr" => Some(Self::Praseodymium),
616            "nd" => Some(Self::Neodymium),
617            "pm" => Some(Self::Promethium),
618            "sm" => Some(Self::Samarium),
619            "eu" => Some(Self::Europium),
620            "gd" => Some(Self::Gadolinium),
621            "tb" => Some(Self::Terbium),
622            "dy" => Some(Self::Dysprosium),
623            "ho" => Some(Self::Holmium),
624            "er" => Some(Self::Erbium),
625            "tm" => Some(Self::Thulium),
626            "yb" => Some(Self::Ytterbium),
627            "lu" => Some(Self::Lutetium),
628            "hf" => Some(Self::Hafnium),
629            "ta" => Some(Self::Tantalum),
630            "w" => Some(Self::Tungsten),
631            "re" => Some(Self::Rhenium),
632            "os" => Some(Self::Osmium),
633            "ir" => Some(Self::Iridium),
634            "pt" => Some(Self::Platinum),
635            "au" => Some(Self::Gold),
636            "hg" => Some(Self::Mercury),
637            "tl" => Some(Self::Thallium),
638            "pb" => Some(Self::Lead),
639            "bi" => Some(Self::Bismuth),
640            "po" => Some(Self::Polonium),
641            "at" => Some(Self::Astatine),
642            "rn" => Some(Self::Radon),
643            "fr" => Some(Self::Francium),
644            "ra" => Some(Self::Radium),
645            "ac" => Some(Self::Actinium),
646            "th" => Some(Self::Thorium),
647            "pa" => Some(Self::Protactinium),
648            "u" => Some(Self::Uranium),
649            "np" => Some(Self::Neptunium),
650            "pu" => Some(Self::Plutonium),
651            "am" => Some(Self::Americium),
652            "cm" => Some(Self::Curium),
653            "bk" => Some(Self::Berkelium),
654            "cf" => Some(Self::Californium),
655            "es" => Some(Self::Einsteinium),
656            "fm" => Some(Self::Fermium),
657            "md" => Some(Self::Mendelevium),
658            "no" => Some(Self::Nobelium),
659            "lr" => Some(Self::Lawrencium),
660            "rf" => Some(Self::Rutherfordium),
661            "db" => Some(Self::Dubnium),
662            "sg" => Some(Self::Seaborgium),
663            "bh" => Some(Self::Bohrium),
664            "hs" => Some(Self::Hassium),
665            "mt" => Some(Self::Meitnerium),
666            "ds" => Some(Self::Darmstadtium),
667            "rg" => Some(Self::Roentgenium),
668            "cn" => Some(Self::Copernicium),
669            "nh" => Some(Self::Nihonium),
670            "fl" => Some(Self::Flerovium),
671            "mc" => Some(Self::Moscovium),
672            "lv" => Some(Self::Livermorium),
673            "ts" => Some(Self::Tennessine),
674            "og" => Some(Self::Oganesson),
675            _ => None,
676        }
677    }
678
679    /// Returns `Element` corresponding to specified atomic number.
680    ///
681    /// # Returns
682    ///
683    /// - `Some(element)` if `atomic_number` ∈ `[1, 118]`
684    /// - `None` if `atomic_number` ∉ `[1, 118]`
685    ///
686    /// # Examples
687    ///
688    /// ```
689    /// use nkl::core::Element;
690    ///
691    /// assert_eq!(Element::from_atomic_number(1), Some(Element::Hydrogen));
692    /// ```
693    pub fn from_atomic_number(atomic_number: u32) -> Option<Self> {
694        match atomic_number {
695            1 => Some(Self::Hydrogen),
696            2 => Some(Self::Helium),
697            3 => Some(Self::Lithium),
698            4 => Some(Self::Beryllium),
699            5 => Some(Self::Boron),
700            6 => Some(Self::Carbon),
701            7 => Some(Self::Nitrogen),
702            8 => Some(Self::Oxygen),
703            9 => Some(Self::Fluorine),
704            10 => Some(Self::Neon),
705            11 => Some(Self::Sodium),
706            12 => Some(Self::Magnesium),
707            13 => Some(Self::Aluminium),
708            14 => Some(Self::Silicon),
709            15 => Some(Self::Phosphorus),
710            16 => Some(Self::Sulfur),
711            17 => Some(Self::Chlorine),
712            18 => Some(Self::Argon),
713            19 => Some(Self::Potassium),
714            20 => Some(Self::Calcium),
715            21 => Some(Self::Scandium),
716            22 => Some(Self::Titanium),
717            23 => Some(Self::Vanadium),
718            24 => Some(Self::Chromium),
719            25 => Some(Self::Manganese),
720            26 => Some(Self::Iron),
721            27 => Some(Self::Cobalt),
722            28 => Some(Self::Nickel),
723            29 => Some(Self::Copper),
724            30 => Some(Self::Zinc),
725            31 => Some(Self::Gallium),
726            32 => Some(Self::Germanium),
727            33 => Some(Self::Arsenic),
728            34 => Some(Self::Selenium),
729            35 => Some(Self::Bromine),
730            36 => Some(Self::Krypton),
731            37 => Some(Self::Rubidium),
732            38 => Some(Self::Strontium),
733            39 => Some(Self::Yttrium),
734            40 => Some(Self::Zirconium),
735            41 => Some(Self::Niobium),
736            42 => Some(Self::Molybdenum),
737            43 => Some(Self::Technetium),
738            44 => Some(Self::Ruthenium),
739            45 => Some(Self::Rhodium),
740            46 => Some(Self::Palladium),
741            47 => Some(Self::Silver),
742            48 => Some(Self::Cadmium),
743            49 => Some(Self::Indium),
744            50 => Some(Self::Tin),
745            51 => Some(Self::Antimony),
746            52 => Some(Self::Tellurium),
747            53 => Some(Self::Iodine),
748            54 => Some(Self::Xenon),
749            55 => Some(Self::Caesium),
750            56 => Some(Self::Barium),
751            57 => Some(Self::Lanthanum),
752            58 => Some(Self::Cerium),
753            59 => Some(Self::Praseodymium),
754            60 => Some(Self::Neodymium),
755            61 => Some(Self::Promethium),
756            62 => Some(Self::Samarium),
757            63 => Some(Self::Europium),
758            64 => Some(Self::Gadolinium),
759            65 => Some(Self::Terbium),
760            66 => Some(Self::Dysprosium),
761            67 => Some(Self::Holmium),
762            68 => Some(Self::Erbium),
763            69 => Some(Self::Thulium),
764            70 => Some(Self::Ytterbium),
765            71 => Some(Self::Lutetium),
766            72 => Some(Self::Hafnium),
767            73 => Some(Self::Tantalum),
768            74 => Some(Self::Tungsten),
769            75 => Some(Self::Rhenium),
770            76 => Some(Self::Osmium),
771            77 => Some(Self::Iridium),
772            78 => Some(Self::Platinum),
773            79 => Some(Self::Gold),
774            80 => Some(Self::Mercury),
775            81 => Some(Self::Thallium),
776            82 => Some(Self::Lead),
777            83 => Some(Self::Bismuth),
778            84 => Some(Self::Polonium),
779            85 => Some(Self::Astatine),
780            86 => Some(Self::Radon),
781            87 => Some(Self::Francium),
782            88 => Some(Self::Radium),
783            89 => Some(Self::Actinium),
784            90 => Some(Self::Thorium),
785            91 => Some(Self::Protactinium),
786            92 => Some(Self::Uranium),
787            93 => Some(Self::Neptunium),
788            94 => Some(Self::Plutonium),
789            95 => Some(Self::Americium),
790            96 => Some(Self::Curium),
791            97 => Some(Self::Berkelium),
792            98 => Some(Self::Californium),
793            99 => Some(Self::Einsteinium),
794            100 => Some(Self::Fermium),
795            101 => Some(Self::Mendelevium),
796            102 => Some(Self::Nobelium),
797            103 => Some(Self::Lawrencium),
798            104 => Some(Self::Rutherfordium),
799            105 => Some(Self::Dubnium),
800            106 => Some(Self::Seaborgium),
801            107 => Some(Self::Bohrium),
802            108 => Some(Self::Hassium),
803            109 => Some(Self::Meitnerium),
804            110 => Some(Self::Darmstadtium),
805            111 => Some(Self::Roentgenium),
806            112 => Some(Self::Copernicium),
807            113 => Some(Self::Nihonium),
808            114 => Some(Self::Flerovium),
809            115 => Some(Self::Moscovium),
810            116 => Some(Self::Livermorium),
811            117 => Some(Self::Tennessine),
812            118 => Some(Self::Oganesson),
813            _ => None,
814        }
815    }
816
817    /// Returns `Element`'s name.
818    ///
819    /// # Examples
820    ///
821    /// ```
822    /// use nkl::core::Element;
823    ///
824    /// assert_eq!(Element::Hydrogen.name(), "Hydrogen");
825    /// ```
826    pub fn name(&self) -> &str {
827        match self {
828            Self::Hydrogen => "Hydrogen",
829            Self::Helium => "Helium",
830            Self::Lithium => "Lithium",
831            Self::Beryllium => "Beryllium",
832            Self::Boron => "Boron",
833            Self::Carbon => "Carbon",
834            Self::Nitrogen => "Nitrogen",
835            Self::Oxygen => "Oxygen",
836            Self::Fluorine => "Fluorine",
837            Self::Neon => "Neon",
838            Self::Sodium => "Sodium",
839            Self::Magnesium => "Magnesium",
840            Self::Aluminium => "Aluminium",
841            Self::Silicon => "Silicon",
842            Self::Phosphorus => "Phosphorus",
843            Self::Sulfur => "Sulfur",
844            Self::Chlorine => "Chlorine",
845            Self::Argon => "Argon",
846            Self::Potassium => "Potassium",
847            Self::Calcium => "Calcium",
848            Self::Scandium => "Scandium",
849            Self::Titanium => "Titanium",
850            Self::Vanadium => "Vanadium",
851            Self::Chromium => "Chromium",
852            Self::Manganese => "Manganese",
853            Self::Iron => "Iron",
854            Self::Cobalt => "Cobalt",
855            Self::Nickel => "Nickel",
856            Self::Copper => "Copper",
857            Self::Zinc => "Zinc",
858            Self::Gallium => "Gallium",
859            Self::Germanium => "Germanium",
860            Self::Arsenic => "Arsenic",
861            Self::Selenium => "Selenium",
862            Self::Bromine => "Bromine",
863            Self::Krypton => "Krypton",
864            Self::Rubidium => "Rubidium",
865            Self::Strontium => "Strontium",
866            Self::Yttrium => "Yttrium",
867            Self::Zirconium => "Zirconium",
868            Self::Niobium => "Niobium",
869            Self::Molybdenum => "Molybdenum",
870            Self::Technetium => "Technetium",
871            Self::Ruthenium => "Ruthenium",
872            Self::Rhodium => "Rhodium",
873            Self::Palladium => "Palladium",
874            Self::Silver => "Silver",
875            Self::Cadmium => "Cadmium",
876            Self::Indium => "Indium",
877            Self::Tin => "Tin",
878            Self::Antimony => "Antimony",
879            Self::Tellurium => "Tellurium",
880            Self::Iodine => "Iodine",
881            Self::Xenon => "Xenon",
882            Self::Caesium => "Caesium",
883            Self::Barium => "Barium",
884            Self::Lanthanum => "Lanthanum",
885            Self::Cerium => "Cerium",
886            Self::Praseodymium => "Praseodymium",
887            Self::Neodymium => "Neodymium",
888            Self::Promethium => "Promethium",
889            Self::Samarium => "Samarium",
890            Self::Europium => "Europium",
891            Self::Gadolinium => "Gadolinium",
892            Self::Terbium => "Terbium",
893            Self::Dysprosium => "Dysprosium",
894            Self::Holmium => "Holmium",
895            Self::Erbium => "Erbium",
896            Self::Thulium => "Thulium",
897            Self::Ytterbium => "Ytterbium",
898            Self::Lutetium => "Lutetium",
899            Self::Hafnium => "Hafnium",
900            Self::Tantalum => "Tantalum",
901            Self::Tungsten => "Tungsten",
902            Self::Rhenium => "Rhenium",
903            Self::Osmium => "Osmium",
904            Self::Iridium => "Iridium",
905            Self::Platinum => "Platinum",
906            Self::Gold => "Gold",
907            Self::Mercury => "Mercury",
908            Self::Thallium => "Thallium",
909            Self::Lead => "Lead",
910            Self::Bismuth => "Bismuth",
911            Self::Polonium => "Polonium",
912            Self::Astatine => "Astatine",
913            Self::Radon => "Radon",
914            Self::Francium => "Francium",
915            Self::Radium => "Radium",
916            Self::Actinium => "Actinium",
917            Self::Thorium => "Thorium",
918            Self::Protactinium => "Protactinium",
919            Self::Uranium => "Uranium",
920            Self::Neptunium => "Neptunium",
921            Self::Plutonium => "Plutonium",
922            Self::Americium => "Americium",
923            Self::Curium => "Curium",
924            Self::Berkelium => "Berkelium",
925            Self::Californium => "Californium",
926            Self::Einsteinium => "Einsteinium",
927            Self::Fermium => "Fermium",
928            Self::Mendelevium => "Mendelevium",
929            Self::Nobelium => "Nobelium",
930            Self::Lawrencium => "Lawrencium",
931            Self::Rutherfordium => "Rutherfordium",
932            Self::Dubnium => "Dubnium",
933            Self::Seaborgium => "Seaborgium",
934            Self::Bohrium => "Bohrium",
935            Self::Hassium => "Hassium",
936            Self::Meitnerium => "Meitnerium",
937            Self::Darmstadtium => "Darmstadtium",
938            Self::Roentgenium => "Roentgenium",
939            Self::Copernicium => "Copernicium",
940            Self::Nihonium => "Nihonium",
941            Self::Flerovium => "Flerovium",
942            Self::Moscovium => "Moscovium",
943            Self::Livermorium => "Livermorium",
944            Self::Tennessine => "Tennessine",
945            Self::Oganesson => "Oganesson",
946        }
947    }
948
949    /// Returns `Element`'s symbol.
950    ///
951    /// # Examples
952    ///
953    /// ```
954    /// use nkl::core::Element;
955    ///
956    /// assert_eq!(Element::Hydrogen.symbol(), "H");
957    /// ```
958    pub fn symbol(&self) -> &str {
959        match self {
960            Self::Hydrogen => "H",
961            Self::Helium => "He",
962            Self::Lithium => "Li",
963            Self::Beryllium => "Be",
964            Self::Boron => "B",
965            Self::Carbon => "C",
966            Self::Nitrogen => "N",
967            Self::Oxygen => "O",
968            Self::Fluorine => "F",
969            Self::Neon => "Ne",
970            Self::Sodium => "Na",
971            Self::Magnesium => "Mg",
972            Self::Aluminium => "Al",
973            Self::Silicon => "Si",
974            Self::Phosphorus => "P",
975            Self::Sulfur => "S",
976            Self::Chlorine => "Cl",
977            Self::Argon => "Ar",
978            Self::Potassium => "K",
979            Self::Calcium => "Ca",
980            Self::Scandium => "Sc",
981            Self::Titanium => "Ti",
982            Self::Vanadium => "V",
983            Self::Chromium => "Cr",
984            Self::Manganese => "Mn",
985            Self::Iron => "Fe",
986            Self::Cobalt => "Co",
987            Self::Nickel => "Ni",
988            Self::Copper => "Cu",
989            Self::Zinc => "Zn",
990            Self::Gallium => "Ga",
991            Self::Germanium => "Ge",
992            Self::Arsenic => "As",
993            Self::Selenium => "Se",
994            Self::Bromine => "Br",
995            Self::Krypton => "Kr",
996            Self::Rubidium => "Rb",
997            Self::Strontium => "Sr",
998            Self::Yttrium => "Y",
999            Self::Zirconium => "Zr",
1000            Self::Niobium => "Nb",
1001            Self::Molybdenum => "Mo",
1002            Self::Technetium => "Tc",
1003            Self::Ruthenium => "Ru",
1004            Self::Rhodium => "Rh",
1005            Self::Palladium => "Pd",
1006            Self::Silver => "Ag",
1007            Self::Cadmium => "Cd",
1008            Self::Indium => "In",
1009            Self::Tin => "Sn",
1010            Self::Antimony => "Sb",
1011            Self::Tellurium => "Te",
1012            Self::Iodine => "I",
1013            Self::Xenon => "Xe",
1014            Self::Caesium => "Cs",
1015            Self::Barium => "Ba",
1016            Self::Lanthanum => "La",
1017            Self::Cerium => "Ce",
1018            Self::Praseodymium => "Pr",
1019            Self::Neodymium => "Nd",
1020            Self::Promethium => "Pm",
1021            Self::Samarium => "Sm",
1022            Self::Europium => "Eu",
1023            Self::Gadolinium => "Gd",
1024            Self::Terbium => "Tb",
1025            Self::Dysprosium => "Dy",
1026            Self::Holmium => "Ho",
1027            Self::Erbium => "Er",
1028            Self::Thulium => "Tm",
1029            Self::Ytterbium => "Yb",
1030            Self::Lutetium => "Lu",
1031            Self::Hafnium => "Hf",
1032            Self::Tantalum => "Ta",
1033            Self::Tungsten => "W",
1034            Self::Rhenium => "Re",
1035            Self::Osmium => "Os",
1036            Self::Iridium => "Ir",
1037            Self::Platinum => "Pt",
1038            Self::Gold => "Au",
1039            Self::Mercury => "Hg",
1040            Self::Thallium => "Tl",
1041            Self::Lead => "Pb",
1042            Self::Bismuth => "Bi",
1043            Self::Polonium => "Po",
1044            Self::Astatine => "At",
1045            Self::Radon => "Rn",
1046            Self::Francium => "Fr",
1047            Self::Radium => "Ra",
1048            Self::Actinium => "Ac",
1049            Self::Thorium => "Th",
1050            Self::Protactinium => "Pa",
1051            Self::Uranium => "U",
1052            Self::Neptunium => "Np",
1053            Self::Plutonium => "Pu",
1054            Self::Americium => "Am",
1055            Self::Curium => "Cm",
1056            Self::Berkelium => "Bk",
1057            Self::Californium => "Cf",
1058            Self::Einsteinium => "Es",
1059            Self::Fermium => "Fm",
1060            Self::Mendelevium => "Md",
1061            Self::Nobelium => "No",
1062            Self::Lawrencium => "Lr",
1063            Self::Rutherfordium => "Rf",
1064            Self::Dubnium => "Db",
1065            Self::Seaborgium => "Sg",
1066            Self::Bohrium => "Bh",
1067            Self::Hassium => "Hs",
1068            Self::Meitnerium => "Mt",
1069            Self::Darmstadtium => "Ds",
1070            Self::Roentgenium => "Rg",
1071            Self::Copernicium => "Cn",
1072            Self::Nihonium => "Nh",
1073            Self::Flerovium => "Fl",
1074            Self::Moscovium => "Mc",
1075            Self::Livermorium => "Lv",
1076            Self::Tennessine => "Ts",
1077            Self::Oganesson => "Og",
1078        }
1079    }
1080
1081    /// Returns `Element`'s atomic number `Z`.
1082    ///
1083    /// # Examples
1084    ///
1085    /// ```
1086    /// use nkl::core::Element;
1087    ///
1088    /// assert_eq!(Element::Hydrogen.atomic_number(), 1);
1089    /// ```
1090    pub fn atomic_number(&self) -> u32 {
1091        match self {
1092            Self::Hydrogen => 1,
1093            Self::Helium => 2,
1094            Self::Lithium => 3,
1095            Self::Beryllium => 4,
1096            Self::Boron => 5,
1097            Self::Carbon => 6,
1098            Self::Nitrogen => 7,
1099            Self::Oxygen => 8,
1100            Self::Fluorine => 9,
1101            Self::Neon => 10,
1102            Self::Sodium => 11,
1103            Self::Magnesium => 12,
1104            Self::Aluminium => 13,
1105            Self::Silicon => 14,
1106            Self::Phosphorus => 15,
1107            Self::Sulfur => 16,
1108            Self::Chlorine => 17,
1109            Self::Argon => 18,
1110            Self::Potassium => 19,
1111            Self::Calcium => 20,
1112            Self::Scandium => 21,
1113            Self::Titanium => 22,
1114            Self::Vanadium => 23,
1115            Self::Chromium => 24,
1116            Self::Manganese => 25,
1117            Self::Iron => 26,
1118            Self::Cobalt => 27,
1119            Self::Nickel => 28,
1120            Self::Copper => 29,
1121            Self::Zinc => 30,
1122            Self::Gallium => 31,
1123            Self::Germanium => 32,
1124            Self::Arsenic => 33,
1125            Self::Selenium => 34,
1126            Self::Bromine => 35,
1127            Self::Krypton => 36,
1128            Self::Rubidium => 37,
1129            Self::Strontium => 38,
1130            Self::Yttrium => 39,
1131            Self::Zirconium => 40,
1132            Self::Niobium => 41,
1133            Self::Molybdenum => 42,
1134            Self::Technetium => 43,
1135            Self::Ruthenium => 44,
1136            Self::Rhodium => 45,
1137            Self::Palladium => 46,
1138            Self::Silver => 47,
1139            Self::Cadmium => 48,
1140            Self::Indium => 49,
1141            Self::Tin => 50,
1142            Self::Antimony => 51,
1143            Self::Tellurium => 52,
1144            Self::Iodine => 53,
1145            Self::Xenon => 54,
1146            Self::Caesium => 55,
1147            Self::Barium => 56,
1148            Self::Lanthanum => 57,
1149            Self::Cerium => 58,
1150            Self::Praseodymium => 59,
1151            Self::Neodymium => 60,
1152            Self::Promethium => 61,
1153            Self::Samarium => 62,
1154            Self::Europium => 63,
1155            Self::Gadolinium => 64,
1156            Self::Terbium => 65,
1157            Self::Dysprosium => 66,
1158            Self::Holmium => 67,
1159            Self::Erbium => 68,
1160            Self::Thulium => 69,
1161            Self::Ytterbium => 70,
1162            Self::Lutetium => 71,
1163            Self::Hafnium => 72,
1164            Self::Tantalum => 73,
1165            Self::Tungsten => 74,
1166            Self::Rhenium => 75,
1167            Self::Osmium => 76,
1168            Self::Iridium => 77,
1169            Self::Platinum => 78,
1170            Self::Gold => 79,
1171            Self::Mercury => 80,
1172            Self::Thallium => 81,
1173            Self::Lead => 82,
1174            Self::Bismuth => 83,
1175            Self::Polonium => 84,
1176            Self::Astatine => 85,
1177            Self::Radon => 86,
1178            Self::Francium => 87,
1179            Self::Radium => 88,
1180            Self::Actinium => 89,
1181            Self::Thorium => 90,
1182            Self::Protactinium => 91,
1183            Self::Uranium => 92,
1184            Self::Neptunium => 93,
1185            Self::Plutonium => 94,
1186            Self::Americium => 95,
1187            Self::Curium => 96,
1188            Self::Berkelium => 97,
1189            Self::Californium => 98,
1190            Self::Einsteinium => 99,
1191            Self::Fermium => 100,
1192            Self::Mendelevium => 101,
1193            Self::Nobelium => 102,
1194            Self::Lawrencium => 103,
1195            Self::Rutherfordium => 104,
1196            Self::Dubnium => 105,
1197            Self::Seaborgium => 106,
1198            Self::Bohrium => 107,
1199            Self::Hassium => 108,
1200            Self::Meitnerium => 109,
1201            Self::Darmstadtium => 110,
1202            Self::Roentgenium => 111,
1203            Self::Copernicium => 112,
1204            Self::Nihonium => 113,
1205            Self::Flerovium => 114,
1206            Self::Moscovium => 115,
1207            Self::Livermorium => 116,
1208            Self::Tennessine => 117,
1209            Self::Oganesson => 118,
1210        }
1211    }
1212
1213    /// Returns `Element`'s period (periodic table row number).
1214    ///
1215    /// # Examples
1216    ///
1217    /// ```
1218    /// use nkl::core::Element;
1219    ///
1220    /// assert_eq!(Element::Hydrogen.period(), 1);
1221    /// ```
1222    ///
1223    /// # References
1224    ///
1225    /// [Wikipedia: Period (periodic table)](https://en.wikipedia.org/wiki/Period_(periodic_table))
1226    pub fn period(&self) -> u32 {
1227        match self {
1228            Element::Hydrogen => 1,
1229            Element::Helium => 1,
1230            Element::Lithium => 2,
1231            Element::Beryllium => 2,
1232            Element::Boron => 2,
1233            Element::Carbon => 2,
1234            Element::Nitrogen => 2,
1235            Element::Oxygen => 2,
1236            Element::Fluorine => 2,
1237            Element::Neon => 2,
1238            Element::Sodium => 3,
1239            Element::Magnesium => 3,
1240            Element::Aluminium => 3,
1241            Element::Silicon => 3,
1242            Element::Phosphorus => 3,
1243            Element::Sulfur => 3,
1244            Element::Chlorine => 3,
1245            Element::Argon => 3,
1246            Element::Potassium => 4,
1247            Element::Calcium => 4,
1248            Element::Scandium => 4,
1249            Element::Titanium => 4,
1250            Element::Vanadium => 4,
1251            Element::Chromium => 4,
1252            Element::Manganese => 4,
1253            Element::Iron => 4,
1254            Element::Cobalt => 4,
1255            Element::Nickel => 4,
1256            Element::Copper => 4,
1257            Element::Zinc => 4,
1258            Element::Gallium => 4,
1259            Element::Germanium => 4,
1260            Element::Arsenic => 4,
1261            Element::Selenium => 4,
1262            Element::Bromine => 4,
1263            Element::Krypton => 4,
1264            Element::Rubidium => 5,
1265            Element::Strontium => 5,
1266            Element::Yttrium => 5,
1267            Element::Zirconium => 5,
1268            Element::Niobium => 5,
1269            Element::Molybdenum => 5,
1270            Element::Technetium => 5,
1271            Element::Ruthenium => 5,
1272            Element::Rhodium => 5,
1273            Element::Palladium => 5,
1274            Element::Silver => 5,
1275            Element::Cadmium => 5,
1276            Element::Indium => 5,
1277            Element::Tin => 5,
1278            Element::Antimony => 5,
1279            Element::Tellurium => 5,
1280            Element::Iodine => 5,
1281            Element::Xenon => 5,
1282            Element::Caesium => 6,
1283            Element::Barium => 6,
1284            Element::Lanthanum => 6,
1285            Element::Cerium => 6,
1286            Element::Praseodymium => 6,
1287            Element::Neodymium => 6,
1288            Element::Promethium => 6,
1289            Element::Samarium => 6,
1290            Element::Europium => 6,
1291            Element::Gadolinium => 6,
1292            Element::Terbium => 6,
1293            Element::Dysprosium => 6,
1294            Element::Holmium => 6,
1295            Element::Erbium => 6,
1296            Element::Thulium => 6,
1297            Element::Ytterbium => 6,
1298            Element::Lutetium => 6,
1299            Element::Hafnium => 6,
1300            Element::Tantalum => 6,
1301            Element::Tungsten => 6,
1302            Element::Rhenium => 6,
1303            Element::Osmium => 6,
1304            Element::Iridium => 6,
1305            Element::Platinum => 6,
1306            Element::Gold => 6,
1307            Element::Mercury => 6,
1308            Element::Thallium => 6,
1309            Element::Lead => 6,
1310            Element::Bismuth => 6,
1311            Element::Polonium => 6,
1312            Element::Astatine => 6,
1313            Element::Radon => 6,
1314            Element::Francium => 7,
1315            Element::Radium => 7,
1316            Element::Actinium => 7,
1317            Element::Thorium => 7,
1318            Element::Protactinium => 7,
1319            Element::Uranium => 7,
1320            Element::Neptunium => 7,
1321            Element::Plutonium => 7,
1322            Element::Americium => 7,
1323            Element::Curium => 7,
1324            Element::Berkelium => 7,
1325            Element::Californium => 7,
1326            Element::Einsteinium => 7,
1327            Element::Fermium => 7,
1328            Element::Mendelevium => 7,
1329            Element::Nobelium => 7,
1330            Element::Lawrencium => 7,
1331            Element::Rutherfordium => 7,
1332            Element::Dubnium => 7,
1333            Element::Seaborgium => 7,
1334            Element::Bohrium => 7,
1335            Element::Hassium => 7,
1336            Element::Meitnerium => 7,
1337            Element::Darmstadtium => 7,
1338            Element::Roentgenium => 7,
1339            Element::Copernicium => 7,
1340            Element::Nihonium => 7,
1341            Element::Flerovium => 7,
1342            Element::Moscovium => 7,
1343            Element::Livermorium => 7,
1344            Element::Tennessine => 7,
1345            Element::Oganesson => 7,
1346        }
1347    }
1348
1349    /// Returns `Element`'s group (periodic table column number).
1350    ///
1351    /// # Examples
1352    ///
1353    /// ```
1354    /// use nkl::core::Element;
1355    ///
1356    /// assert_eq!(Element::Hydrogen.group(), Some(1));
1357    /// ```
1358    ///
1359    /// # Notes
1360    ///
1361    /// Lanthanides and actinides (f-block) do not have a group.
1362    ///
1363    /// # References
1364    ///
1365    /// [Wikipedia: Group (periodic table)](https://en.wikipedia.org/wiki/Group_(periodic_table))
1366    pub fn group(&self) -> Option<u32> {
1367        match self {
1368            Element::Hydrogen => Some(1),
1369            Element::Helium => Some(18),
1370            Element::Lithium => Some(1),
1371            Element::Beryllium => Some(2),
1372            Element::Boron => Some(13),
1373            Element::Carbon => Some(14),
1374            Element::Nitrogen => Some(15),
1375            Element::Oxygen => Some(16),
1376            Element::Fluorine => Some(17),
1377            Element::Neon => Some(18),
1378            Element::Sodium => Some(1),
1379            Element::Magnesium => Some(2),
1380            Element::Aluminium => Some(13),
1381            Element::Silicon => Some(14),
1382            Element::Phosphorus => Some(15),
1383            Element::Sulfur => Some(16),
1384            Element::Chlorine => Some(17),
1385            Element::Argon => Some(18),
1386            Element::Potassium => Some(1),
1387            Element::Calcium => Some(2),
1388            Element::Scandium => Some(3),
1389            Element::Titanium => Some(4),
1390            Element::Vanadium => Some(5),
1391            Element::Chromium => Some(6),
1392            Element::Manganese => Some(7),
1393            Element::Iron => Some(8),
1394            Element::Cobalt => Some(9),
1395            Element::Nickel => Some(10),
1396            Element::Copper => Some(11),
1397            Element::Zinc => Some(12),
1398            Element::Gallium => Some(13),
1399            Element::Germanium => Some(14),
1400            Element::Arsenic => Some(15),
1401            Element::Selenium => Some(61),
1402            Element::Bromine => Some(17),
1403            Element::Krypton => Some(18),
1404            Element::Rubidium => Some(1),
1405            Element::Strontium => Some(2),
1406            Element::Yttrium => Some(3),
1407            Element::Zirconium => Some(4),
1408            Element::Niobium => Some(5),
1409            Element::Molybdenum => Some(6),
1410            Element::Technetium => Some(7),
1411            Element::Ruthenium => Some(8),
1412            Element::Rhodium => Some(9),
1413            Element::Palladium => Some(10),
1414            Element::Silver => Some(11),
1415            Element::Cadmium => Some(12),
1416            Element::Indium => Some(13),
1417            Element::Tin => Some(14),
1418            Element::Antimony => Some(15),
1419            Element::Tellurium => Some(16),
1420            Element::Iodine => Some(17),
1421            Element::Xenon => Some(18),
1422            Element::Caesium => Some(1),
1423            Element::Barium => Some(2),
1424            Element::Lanthanum => None,
1425            Element::Cerium => None,
1426            Element::Praseodymium => None,
1427            Element::Neodymium => None,
1428            Element::Promethium => None,
1429            Element::Samarium => None,
1430            Element::Europium => None,
1431            Element::Gadolinium => None,
1432            Element::Terbium => None,
1433            Element::Dysprosium => None,
1434            Element::Holmium => None,
1435            Element::Erbium => None,
1436            Element::Thulium => None,
1437            Element::Ytterbium => None,
1438            Element::Lutetium => Some(3),
1439            Element::Hafnium => Some(4),
1440            Element::Tantalum => Some(5),
1441            Element::Tungsten => Some(6),
1442            Element::Rhenium => Some(7),
1443            Element::Osmium => Some(8),
1444            Element::Iridium => Some(9),
1445            Element::Platinum => Some(10),
1446            Element::Gold => Some(11),
1447            Element::Mercury => Some(12),
1448            Element::Thallium => Some(13),
1449            Element::Lead => Some(14),
1450            Element::Bismuth => Some(15),
1451            Element::Polonium => Some(16),
1452            Element::Astatine => Some(17),
1453            Element::Radon => Some(18),
1454            Element::Francium => Some(1),
1455            Element::Radium => Some(2),
1456            Element::Actinium => None,
1457            Element::Thorium => None,
1458            Element::Protactinium => None,
1459            Element::Uranium => None,
1460            Element::Neptunium => None,
1461            Element::Plutonium => None,
1462            Element::Americium => None,
1463            Element::Curium => None,
1464            Element::Berkelium => None,
1465            Element::Californium => None,
1466            Element::Einsteinium => None,
1467            Element::Fermium => None,
1468            Element::Mendelevium => None,
1469            Element::Nobelium => None,
1470            Element::Lawrencium => Some(3),
1471            Element::Rutherfordium => Some(4),
1472            Element::Dubnium => Some(5),
1473            Element::Seaborgium => Some(6),
1474            Element::Bohrium => Some(7),
1475            Element::Hassium => Some(8),
1476            Element::Meitnerium => Some(9),
1477            Element::Darmstadtium => Some(10),
1478            Element::Roentgenium => Some(11),
1479            Element::Copernicium => Some(12),
1480            Element::Nihonium => Some(13),
1481            Element::Flerovium => Some(14),
1482            Element::Moscovium => Some(15),
1483            Element::Livermorium => Some(16),
1484            Element::Tennessine => Some(17),
1485            Element::Oganesson => Some(18),
1486        }
1487    }
1488
1489    /// Returns `Element`'s block (characteristic orbital set).
1490    ///
1491    /// # Examples
1492    ///
1493    /// ```
1494    /// use nkl::core::Element;
1495    ///
1496    /// assert_eq!(Element::Hydrogen.block(), "s");
1497    /// ```
1498    ///
1499    /// # References
1500    ///
1501    /// [Wikipedia: Block (periodic table)](https://en.wikipedia.org/wiki/Block_(periodic_table))
1502    pub fn block(&self) -> &str {
1503        match self {
1504            Element::Hydrogen => "s",
1505            Element::Helium => "s",
1506            Element::Lithium => "s",
1507            Element::Beryllium => "s",
1508            Element::Boron => "p",
1509            Element::Carbon => "p",
1510            Element::Nitrogen => "p",
1511            Element::Oxygen => "p",
1512            Element::Fluorine => "p",
1513            Element::Neon => "p",
1514            Element::Sodium => "s",
1515            Element::Magnesium => "s",
1516            Element::Aluminium => "p",
1517            Element::Silicon => "p",
1518            Element::Phosphorus => "p",
1519            Element::Sulfur => "p",
1520            Element::Chlorine => "p",
1521            Element::Argon => "p",
1522            Element::Potassium => "s",
1523            Element::Calcium => "s",
1524            Element::Scandium => "d",
1525            Element::Titanium => "d",
1526            Element::Vanadium => "d",
1527            Element::Chromium => "d",
1528            Element::Manganese => "d",
1529            Element::Iron => "d",
1530            Element::Cobalt => "d",
1531            Element::Nickel => "d",
1532            Element::Copper => "d",
1533            Element::Zinc => "d",
1534            Element::Gallium => "p",
1535            Element::Germanium => "p",
1536            Element::Arsenic => "p",
1537            Element::Selenium => "p",
1538            Element::Bromine => "p",
1539            Element::Krypton => "p",
1540            Element::Rubidium => "s",
1541            Element::Strontium => "s",
1542            Element::Yttrium => "d",
1543            Element::Zirconium => "d",
1544            Element::Niobium => "d",
1545            Element::Molybdenum => "d",
1546            Element::Technetium => "d",
1547            Element::Ruthenium => "d",
1548            Element::Rhodium => "d",
1549            Element::Palladium => "d",
1550            Element::Silver => "d",
1551            Element::Cadmium => "d",
1552            Element::Indium => "p",
1553            Element::Tin => "p",
1554            Element::Antimony => "p",
1555            Element::Tellurium => "p",
1556            Element::Iodine => "p",
1557            Element::Xenon => "p",
1558            Element::Caesium => "s",
1559            Element::Barium => "s",
1560            Element::Lanthanum => "f",
1561            Element::Cerium => "f",
1562            Element::Praseodymium => "f",
1563            Element::Neodymium => "f",
1564            Element::Promethium => "f",
1565            Element::Samarium => "f",
1566            Element::Europium => "f",
1567            Element::Gadolinium => "f",
1568            Element::Terbium => "f",
1569            Element::Dysprosium => "f",
1570            Element::Holmium => "f",
1571            Element::Erbium => "f",
1572            Element::Thulium => "f",
1573            Element::Ytterbium => "f",
1574            Element::Lutetium => "d",
1575            Element::Hafnium => "d",
1576            Element::Tantalum => "d",
1577            Element::Tungsten => "d",
1578            Element::Rhenium => "d",
1579            Element::Osmium => "d",
1580            Element::Iridium => "d",
1581            Element::Platinum => "d",
1582            Element::Gold => "d",
1583            Element::Mercury => "d",
1584            Element::Thallium => "p",
1585            Element::Lead => "p",
1586            Element::Bismuth => "p",
1587            Element::Polonium => "p",
1588            Element::Astatine => "p",
1589            Element::Radon => "p",
1590            Element::Francium => "s",
1591            Element::Radium => "s",
1592            Element::Actinium => "f",
1593            Element::Thorium => "f",
1594            Element::Protactinium => "f",
1595            Element::Uranium => "f",
1596            Element::Neptunium => "f",
1597            Element::Plutonium => "f",
1598            Element::Americium => "f",
1599            Element::Curium => "f",
1600            Element::Berkelium => "f",
1601            Element::Californium => "f",
1602            Element::Einsteinium => "f",
1603            Element::Fermium => "f",
1604            Element::Mendelevium => "f",
1605            Element::Nobelium => "f",
1606            Element::Lawrencium => "d",
1607            Element::Rutherfordium => "d",
1608            Element::Dubnium => "d",
1609            Element::Seaborgium => "d",
1610            Element::Bohrium => "d",
1611            Element::Hassium => "d",
1612            Element::Meitnerium => "d",
1613            Element::Darmstadtium => "d",
1614            Element::Roentgenium => "d",
1615            Element::Copernicium => "d",
1616            Element::Nihonium => "p",
1617            Element::Flerovium => "p",
1618            Element::Moscovium => "p",
1619            Element::Livermorium => "p",
1620            Element::Tennessine => "p",
1621            Element::Oganesson => "p",
1622        }
1623    }
1624
1625    /// Returns an iterator over all elements.
1626    ///
1627    /// # Examples
1628    ///
1629    /// ```
1630    /// use nkl::core::Element;
1631    ///
1632    /// for element in Element::iter() {
1633    ///     println!("{}", element.name());
1634    /// }
1635    /// ```
1636    pub fn iter() -> impl Iterator<Item = Element> {
1637        Self::ELEMENTS.iter().copied()
1638    }
1639
1640    /// Returns `true` if this `Element` is an alkali metal.
1641    ///
1642    /// # Examples
1643    ///
1644    /// ```
1645    /// use nkl::core::Element;
1646    ///
1647    /// assert!(Element::Lithium.is_alkali_metal());
1648    /// assert!(!Element::Iron.is_alkali_metal());
1649    /// ```
1650    ///
1651    /// # References
1652    ///
1653    /// [Wikipedia: Alkali metal](https://en.wikipedia.org/wiki/Alkali_metal)
1654    pub fn is_alkali_metal(&self) -> bool {
1655        matches!(
1656            self,
1657            Self::Lithium
1658                | Self::Sodium
1659                | Self::Potassium
1660                | Self::Rubidium
1661                | Self::Caesium
1662                | Self::Francium
1663        )
1664    }
1665
1666    /// Returns `true` if this `Element` is an alkaline earth metal.
1667    ///
1668    /// # Examples
1669    ///
1670    /// ```
1671    /// use nkl::core::Element;
1672    ///
1673    /// assert!(Element::Beryllium.is_alkaline_earth_metal());
1674    /// assert!(!Element::Iron.is_alkaline_earth_metal());
1675    /// ```
1676    ///
1677    /// # References
1678    ///
1679    /// [Wikipedia: Alkaline earth metal](https://en.wikipedia.org/wiki/Alkaline_earth_metal)
1680    pub fn is_alkaline_earth_metal(&self) -> bool {
1681        matches!(
1682            self,
1683            Self::Beryllium
1684                | Self::Magnesium
1685                | Self::Calcium
1686                | Self::Strontium
1687                | Self::Barium
1688                | Self::Radium
1689        )
1690    }
1691
1692    /// Returns `true` if this `Element` is a pnictogen.
1693    ///
1694    /// # Examples
1695    ///
1696    /// ```
1697    /// use nkl::core::Element;
1698    ///
1699    /// assert!(Element::Nitrogen.is_pnictogen());
1700    /// assert!(!Element::Iron.is_pnictogen());
1701    /// ```
1702    ///
1703    /// # References
1704    ///
1705    /// [Wikipedia: Pnictogen](https://en.wikipedia.org/wiki/Pnictogen)
1706    pub fn is_pnictogen(&self) -> bool {
1707        matches!(
1708            self,
1709            Self::Nitrogen
1710                | Self::Phosphorus
1711                | Self::Arsenic
1712                | Self::Antimony
1713                | Self::Bismuth
1714                | Self::Moscovium
1715        )
1716    }
1717
1718    /// Returns `true` if this `Element` is a chalcogen.
1719    ///
1720    /// # Examples
1721    ///
1722    /// ```
1723    /// use nkl::core::Element;
1724    ///
1725    /// assert!(Element::Oxygen.is_chalcogen());
1726    /// assert!(!Element::Iron.is_chalcogen());
1727    /// ```
1728    ///
1729    /// # References
1730    ///
1731    /// [Wikipedia: Chalcogen](https://en.wikipedia.org/wiki/Chalcogen)
1732    pub fn is_chalcogen(&self) -> bool {
1733        matches!(
1734            self,
1735            Self::Oxygen
1736                | Self::Sulfur
1737                | Self::Selenium
1738                | Self::Tellurium
1739                | Self::Polonium
1740                | Self::Livermorium
1741        )
1742    }
1743
1744    /// Returns `true` if this `Element` is an halogen.
1745    ///
1746    /// # Examples
1747    ///
1748    /// ```
1749    /// use nkl::core::Element;
1750    ///
1751    /// assert!(Element::Fluorine.is_halogen());
1752    /// assert!(!Element::Iron.is_halogen());
1753    /// ```
1754    ///
1755    /// # References
1756    ///
1757    /// [Wikipedia: Halogen](https://en.wikipedia.org/wiki/Halogen)
1758    pub fn is_halogen(&self) -> bool {
1759        matches!(
1760            self,
1761            Self::Fluorine
1762                | Self::Chlorine
1763                | Self::Bromine
1764                | Self::Iodine
1765                | Self::Astatine
1766                | Self::Tennessine
1767        )
1768    }
1769
1770    /// Returns `true` if this `Element` is a noble gas.
1771    ///
1772    /// # Examples
1773    ///
1774    /// ```
1775    /// use nkl::core::Element;
1776    ///
1777    /// assert!(Element::Helium.is_noble_gas());
1778    /// assert!(!Element::Iron.is_noble_gas());
1779    /// ```
1780    ///
1781    /// # References
1782    ///
1783    /// [Wikipedia: Noble gas](https://en.wikipedia.org/wiki/Noble_gas)
1784    pub fn is_noble_gas(&self) -> bool {
1785        matches!(
1786            self,
1787            Self::Helium
1788                | Self::Neon
1789                | Self::Argon
1790                | Self::Krypton
1791                | Self::Xenon
1792                | Self::Radon
1793                | Self::Oganesson
1794        )
1795    }
1796}