module Tile.Neighborhood ( neighbors, ) where import Tile.Affine import Tile.Shape neighbors :: AffineRankSpace -> Int -> [Int] neighbors :: AffineRankSpace -> Int -> [Int] neighbors AffineRankSpace rankSpace Int rank = let point :: [Int] point = AffineRankSpace -> Int -> [Int] pointOf AffineRankSpace rankSpace Int rank in [ AffineRankSpace -> [Int] -> Int rankOf AffineRankSpace rankSpace [Int] p' | [Int] p' <- [Int] -> [Int] -> [[Int]] neighborPoints (AffineRankSpace -> [Int] sizes AffineRankSpace rankSpace) [Int] point ] neighborPoints :: Shape -> Point -> [Point] neighborPoints :: [Int] -> [Int] -> [[Int]] neighborPoints [Int] shape [Int] point = [[[Int]]] -> [[Int]] forall (t :: * -> *) a. Foldable t => t [a] -> [a] concat [ Int -> [[Int]] moves Int dim | Int dim <- [Int 0 .. [Int] -> Int forall a. [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length [Int] shape Int -> Int -> Int forall a. Num a => a -> a -> a - Int 1] ] where moves :: Int -> [[Int]] moves Int dim = let x :: Int x = [Int] point [Int] -> Int -> Int forall a. HasCallStack => [a] -> Int -> a !! Int dim lo :: [Int] lo = Int -> Int -> [Int] -> [Int] forall a. Int -> a -> [a] -> [a] replace Int dim (Int x Int -> Int -> Int forall a. Num a => a -> a -> a - Int 1) [Int] point hi :: [Int] hi = Int -> Int -> [Int] -> [Int] forall a. Int -> a -> [a] -> [a] replace Int dim (Int x Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1) [Int] point extent :: Int extent = [Int] shape [Int] -> Int -> Int forall a. HasCallStack => [a] -> Int -> a !! Int dim in [ [Int] p | (Int v, [Int] p) <- [(Int x Int -> Int -> Int forall a. Num a => a -> a -> a - Int 1, [Int] lo), (Int x Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1, [Int] hi)], Int v Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >= Int 0, Int v Int -> Int -> Bool forall a. Ord a => a -> a -> Bool < Int extent ] replace :: Int -> a -> [a] -> [a] replace :: forall a. Int -> a -> [a] -> [a] replace Int i a x [a] xs = Int -> [a] -> [a] forall a. Int -> [a] -> [a] take Int i [a] xs [a] -> [a] -> [a] forall a. [a] -> [a] -> [a] ++ [a x] [a] -> [a] -> [a] forall a. [a] -> [a] -> [a] ++ Int -> [a] -> [a] forall a. Int -> [a] -> [a] drop (Int i Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1) [a] xs