{-# LANGUAGE TypeFamilies #-}

module PathFinding.Class where
import           Data.Proxy

class PathFinding carte where
    type Queue carte
    type Pos carte
    type Neighbor carte

    -- ^ function to find neighboors from pos in carte
    neighbors :: carte -> Pos carte -> [Neighbor carte]
    locate    :: carte -> Neighbor carte -> Pos carte

    -- ^ queue manipulation to allow user-defined queues and specific
    -- optimizations
    mkqueue :: Proxy carte -> [Pos carte] -> Queue carte
    enqueue :: Proxy carte -> [Neighbor carte] -> Queue carte -> Queue carte
    dequeue :: Proxy carte -> Queue carte -> Maybe (Neighbor carte, Queue carte)

    -- ^ type-inference helper function
    proxify :: carte -> Proxy carte
    proxify _ = Proxy