"""
Custom operations and callbacks shared between algorithms.
"""
[docs]class FindClosest:
    """
    Callback that will search for a molecule closest to the target and
    saves it as a copy to the self.closest
    .. seealso:: :class:`~molpher.core.operations.TraverseOper`, :meth:`~molpher.core.ExplorationTree.ExplorationTree.traverse`
    """
    def __init__(self):
        self.closest = None
        """:class:`~molpher.core.MolpherMol.MolpherMol` instance (copy of the closest molecule)
        after the callback was executed, initialized to `None`"""
    def __call__(self, morph):
        if not self.closest:
            self.closest = morph.copy()
            return
        current_dist = self.closest.getDistToTarget()
        morph_dist = morph.getDistToTarget()
        if morph_dist < current_dist:
            self.closest = morph.copy()