\section{Atoms and Molecules} > module ZEBEDDE.Core.Molecule (Atom, > element, > mass, > position, > doToAtom, > Molecule, > name, > basis, > atoms, > newMolecule, > doToMolecule, > doToMolecule') where > import ZEBEDDE.Core.Vector \subsection{Atoms} An atom has a name, a molecular weight and a position. > type Atom = (String,Int,Vec) Access elements of an atom. > element :: Atom -> String > element (a,_,_) = a > mass :: Atom -> Int > mass (_,b,_) = b > position :: Atom -> Vec > position (_,_,c) = c Apply function to the vector component of an atom. > doToAtom f (string,mass,vec) = (string,mass,f vec) \subsection{Molecule} Create molecule strucure, \\ 3 vecorts specifying location and orientation \\ and it is a name and a list of atoms. > type Basis = (Vec,Vec,Vec) > type Molecule = (String,Basis,[Atom]) > name (n,_,_) = n > basis (_,b,_) = b > atoms (_,_,a) = a > getBasis :: [Atom] -> Basis > getBasis atoms = (position (atoms!!0),position (atoms!!1),position (atoms!!2)) > newMolecule name atoms = (name,getBasis atoms,atoms) Apply a function to the atoms of the molecule. > doToMolecule :: ([Atom] -> [Atom]) -> Molecule -> Molecule > doToMolecule f (string,axis,atoms) = newMolecule string (f atoms) Apply a function to each of the positions of the atoms of the molecule. > doToMolecule' :: (Vec -> Vec) -> (Molecule -> Molecule) > doToMolecule' f = doToMolecule (map (doToAtom f))