\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))