/purescript-astar

A* implementation on PureScript

Primary LanguagePureScriptMIT LicenseMIT

purescript-astar

CI

An A* search algorithm implementation on PureScript for 2D planes.

let
    start = {x: 0, y: 0}

    goal = {x: 4, y: 4}

    world =
        [ [ 0, 0, 0, 0, 0 ]
        , [ 0, 0, 0, 1, 0 ]
        , [ 0, 0, 0, 1, 0 ]
        , [ 0, 1, 1, 1, 0 ]
        , [ 0, 0, 0, 0, 0 ]
        ]

    -- tiles with `1` are non-walkable
    blocked = [ 1 ]
in
    runAStarNonDiagonal blocked start goal world

-- the result will be an array of vectors containing the path coordinates
-- including the source and destination cells
[ { x: 0, y: 0 }, { x: 0, y: 1 }, { x: 0, y: 2 }, { x: 0, y: 3 }, { x: 0, y: 4 }
, { x: 1, y: 4 }, { x: 2, y: 4 }, { x: 3, y: 4 }, { x: 4, y: 4 }
]

-- which corresponds to the following path
✯ ,   ,   ,   ,
= ,   ,   , # ,
= ,   ,   , # ,
= , # , # , # ,
= , = , = , = , ⚑

You can use your own types for the blocked parameter, as long as they implement the Ord class and match the ones used for your world 2D array. You can have

data Cell = Wall | Grass

and a grid with

[ [Grass, Wall, Grass]
, [Grass, Wall, Grass]
, [Grass, Grass, Grass]
]

and then use [ Wall ] as the blocked parameter.

Check the test module to see more usage examples.

Based on the work of: