{-# LANGUAGE ScopedTypeVariables #-} module Data.ProxN.Proximity where import Data.ProxN.Tree2N import Data.ProxN.VecN import Control.Applicative prox :: (VecNClass n, Tree2NClass n) => Double -> VecN n Double -> VecTree n Double -> [VecN n Double] prox tol2 vec tree = proximity tol2 vec tree [] proximity :: forall n. (VecNClass n, Tree2NClass n) => Double -> VecN n Double -> VecTree n Double -> ([VecN n Double] -> [VecN n Double]) proximity _ _ Tree2NLeaf = id proximity tol2 vec (Tree2NBranch v t) = if distance2 vec v < tol2 then (v :) . foldTree proximity' (pure (.)) t else proximity tol2 vec (chooseNode vec v t) where proximity' :: VecTree n Double -> ([VecN n Double] -> [VecN n Double]) proximity' Tree2NLeaf = id proximity' (Tree2NBranch v2 t2) = addOrNot . foldTree proximity' (pure (.)) t2 where addOrNot = if distance2 vec v2 < tol2 then (v2 :) else id