wk      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~(c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred3=K`A regular arrangement of tiles where the boundaries are joined. Minimal complete definition:  and . g a" returns the "normal" indices for a:. TODO: need a clearer description and an illustration. g a returns all of the indices in a4's translation group. In other words, it returns a- plus the indices obtained by translating a~ in each direction by the extent of the grid along that direction. TODO: need a clearer description and an illustration.MA regular arrangement of tiles with an edge. Minimal complete definition: .&Returns the number of sides a tile has AReturns a the indices of all the tiles at the boundary of a grid.   g a ' returns True if the tile with index a is on a boundary of g, False6 otherwise. (Corner tiles are also boundary tiles.) Returns the index of the tile(s) that require the maximum number of moves to reach the nearest boundary tile. A grid may have more than one central tile (e.g., a rectangular grid with an even number of rows and columns will have four central tiles).   g a ' returns True if the tile with index a is a centre tile of g, False otherwise.dA regular arrangement of tiles where the number of tiles is finite. Minimal complete definition: , .7Returns the dimensions of the grid. For example, if g is a 4x3 rectangular grid,  g would return (4, 3), while   g would return 12.GReturns the largest possible distance between two tiles in the grid.@A regular arrangement of tiles. Minimal complete definition: , , , , (.+Returns the indices of all tiles in a grid. g a bO returns the minimum number of moves required to get from the tile at index a to the tile at index b in grid gd, moving between adjacent tiles at each step. (Two tiles are adjacent if they share an edge.) If a or b are not contained within g, the result is undefined. g bs aY returns the minimum number of moves required to get from any of the tiles at indices bs to the tile at index a in grid gd, moving between adjacent tiles at each step. (Two tiles are adjacent if they share an edge.) If a or any of bs are not contained within g, the result is undefined. g a1 returns the indices of the tiles in the grid g+ which are adjacent to the tile with index a. g as1 returns the indices of the tiles in the grid g9 which are adjacent to any of the tiles with index in as. g d a0 returns the indices of the tile in the grid g* which is adjacent to the tile with index a, in the direction d. g a, returns the number of tiles in the grid g+ which are adjacent to the tile with index a.g `'contains'` a returns True if the index a! is contained within the grid g, otherwise it returns false. 4Returns the number of tiles in a grid. Compare with .!Returns True+ if the number of tiles in a grid is zero, False otherwise."Returns False+ if the number of tiles in a grid is zero, True otherwise.#iA list of all edges in a grid, where the edges are represented by a pair of indices of adjacent tiles.$$ g aB returns a list of pairs associating the index of each tile in g* with its distance to the tile with index a. If a is not contained within g, the result is undefined.%% g a b returns True if the tile at index a% is adjacent to the tile at index b in g8. (Two tiles are adjacent if they share an edge.) If a or b are not contained within g, the result is undefined.&& g a bO returns the indices of all tiles which are neighbours of the tile at index a), and which are closer to the tile at b than aR is. In other words, it returns the possible next steps on a minimal path from a to b. If a or b are not contained within g!, or if there is no path from a to b6 (e.g., a disconnected grid), the result is undefined.'' g a b? returns a list of all minimal paths from the tile at index a to the tile at index b in grid g. A path is a sequence of tiles where each tile in the sequence is adjacent to the previous one. (Two tiles are adjacent if they share an edge.) If a or b are not contained within g, the result is undefined.:Tip: The default implementation of this function calls &?. If you want to use a custom algorithm, consider modifying & instead of '.(( g a b6 returns the direction(s) of the next tile(s) in a minimal path from the tile at index a to the tile at index b in grid g.:  !"#$%&'()*+,-./0123456789:;<=:  !"#$%&'()*+,-./0123456789:;<=: !"#$%&'()*+,-./01 23456789:;<=   !"#$%&'()*+,-./0123456789:;<=(c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred03=K>A cylindrical grid with triangular tiles, where the cylinder is along the x-axis. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.@A cylindrical grid with triangular tiles, where the cylinder is along the y-axis. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.B~A toroidal grid with triangular tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.DA rectangular grid with triangular tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.FA Parallelogrammatical grid with triangular tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.HA triangular grid with triangular tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.JAn unbounded grid with triangular tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.SIFor triangular tiles, it is convenient to define a third component z.UU s4 returns a triangular grid with sides of length s, using triangular tiles. If s2 is nonnegative, the resulting grid will have s^2[ tiles. Otherwise, the resulting grid will be null and the list of indices will be null.VV r c9 returns a grid in the shape of a parallelogram with r rows and c) columns, using triangular tiles. If r and c7 are both nonnegative, the resulting grid will have 2*r*c[ tiles. Otherwise, the resulting grid will be null and the list of indices will be null.XX r cM returns a grid in the shape of a rectangle (with jagged edges) that has r rows and c) columns, using triangular tiles. If r and c8 are both nonnegative, the resulting grid will have 2*r*c[ tiles. Otherwise, the resulting grid will be null and the list of indices will be null.YY r c returns a toroidal grid with r rows and cO columns, using triangular tiles. The indexing method is the same as for  ParaTriGrid. If r and c8 are both nonnegative, the resulting grid will have 2*r*c[ tiles. Otherwise, the resulting grid will be null and the list of indices will be null.ZZ r c! returns a cylindrical grid with r rows and cu columns, using triangular tiles, where the cylinder is along the y-axis. The indexing method is the same as for  ParaTriGrid . If r and c8 are both nonnegative, the resulting grid will have 2*r*c\ tiles. Otherwise, the resulting grid will be null and the list of indices will be null.[[ r c! returns a cylindrical grid with r rows and cu columns, using triangular tiles, where the cylinder is along the y-axis. The indexing method is the same as for  ParaTriGrid . If r and c8 are both nonnegative, the resulting grid will have 2*r*c\ tiles. Otherwise, the resulting grid will be null and the list of indices will be null.7>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[7LRQPONMJKtSHIsrTqpUFGonmlVWDEkjihXBCgfedY@Acba`Z>?_^]\[*>?@ABCDEFGHIJKLRQPONMSTUVWXYZ[\]^_`abcdefghijklmnopqrst (c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred246>@BDFHJKUVXYZ[JKHUFVDXBY@Z>[(c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred03=KuzA toroidal grid with square tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.w}A rectangular grid with square tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.y|An unbounded grid with square tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki. r c" produces a rectangular grid with r rows and c! columns, using square tiles. If r and c8 are both nonnegative, the resulting grid will have r*c` tiles. Otherwise, the resulting grid will be null and the list of indices will be null. r c returns a toroidal grid with r rows and c! columns, using square tiles. If r and c8 are both nonnegative, the resulting grid will have r*c\ tiles. Otherwise, the resulting grid will be null and the list of indices will be null.uvwxyz{|}~ uvwxyz{|}~{~}|yzwxuvuvwxyz{~}| (c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred246uwyzyzwu(c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred03=KA parallelogramatical grid with hexagonal tiles The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.}A hexagonal grid with hexagonal tiles The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.~An unbounded grid with hexagonal tiles The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki. s< returns a grid of hexagonal shape, with sides of length s, using hexagonal tiles. If s2 is nonnegative, the resulting grid will have  3*s*(s-1) + 1\ tiles. Otherwise, the resulting grid will be null and the list of indices will be null. r c9 returns a grid in the shape of a parallelogram with r rows and c( columns, using hexagonal tiles. If r and c4 are both nonnegative, the resulting grid will have r*c_ tiles. Otherwise, the resulting grid will be null and the list of indices will be null. (c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred246(c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred03=KA rectangular grid with hexagonal tiles The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.}A hexagonal grid with hexagonal tiles The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.~An unbounded grid with hexagonal tiles The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki. s< returns a grid of hexagonal shape, with sides of length s, using hexagonal tiles. If s2 is nonnegative, the resulting grid will have  3*s*(s-1) + 1\ tiles. Otherwise, the resulting grid will be null and the list of indices will be null. r c9 returns a grid in the shape of a parallelogram with r rows and c' columns, using hexagonal tiles. If r and c7 are both nonnegative, the resulting grid will have r*c[ tiles. Otherwise, the resulting grid will be null and the list of indices will be null. (c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred246(c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred03=K}A toroidal grid with octagonal tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.A rectangular grid with octagonal tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki.An unbounded grid with octagonal tiles. The grid and its indexing scheme are illustrated in the user guide, available at  %https://github.com/mhwombat/grid/wiki. r c" produces a rectangular grid with r rows and c$ columns, using octagonal tiles. If r and c8 are both nonnegative, the resulting grid will have r*c` tiles. Otherwise, the resulting grid will be null and the list of indices will be null. r c returns a toroidal grid with r rows and c$ columns, using octagonal tiles. If r and c8 are both nonnegative, the resulting grid will have r*c\ tiles. Otherwise, the resulting grid will be null and the list of indices will be null. (c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred246(c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred246   !"#$%&'(  !"#$%&'( (c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred36=KmA regular arrangement of tiles, having a value associated with each tile. Minimal complete definition: toMap, toGrid,  insertWithKey, delete,  adjustWithKey, alter,  mapWithKey,  filterWithKey.Once a $ is created, the underlying grid is fixed; tiles cannot be added or removed. However, values can be added to empty tiles, and the value at a tile can be modified or removed."Note: Some of the methods have an Ord constraint on the grid index. This is purely to make it easier to write implementations. While tile positions can be ordered (e.g.,  (1,2) < (2,1)P), the ordering may not be particularly meaningful. (Comparisons such as east of or south ofe may be more sensible.) However, it is convenient to write implementations of this class using Data.Map=, with the grid indices as keys. Many of the functions in Data.Map impose the Ord constraint on map keys, so we'll live with it. In summary, to use some methods in this class, your grid indices must be orderable.Find the value at a tile position in the grid. Calls error if the tile is not in the grid, or if the tile does not have an associated value. > let m = lazyGridMap (rectSquareGrid 1 2) ["red","blue"] > m ! (0,0) "red" > m ! (0,5) "*** Exception: Map.!: given key is not an element in the map*Returns a map of tile positions to values. c> toMap $ lazyGridMap (rectSquareGrid 1 2) ["red", "blue"] fromList [((0,0),"red"),((1,0),"blue")],Returns the grid on which this map is based. O> toGrid $ lazyGridMap (rectSquareGrid 1 2) ["red", "blue"] rectSquareGrid 1 2-Convert the map to a list of key/value pairs. [> toList $ lazyGridMap (rectSquareGrid 1 2) ["red", "blue"] [((0,0),"red"),((1,0),"blue")]The expression  k m8 returns the value contained in the tile at position k in the map mL. If the tile does not contain a value, or is outside the map bounds, Nothing is returned. > let m = lazyGridMap (rectSquareGrid 1 2) ["red","blue"] > Math.Geometry.GridMap.lookup (1,0) m Just "blue" > Math.Geometry.GridMap.lookup (5,5) m NothingvInsert a new value at a tile position in the grid map. If the tile already contains a value, the value is replaced. h> insert (1,0) "hello" $ lazyGridMap (rectSquareGrid 1 2) ["red"] lazyGridMap (rectSquareGrid 1 2) ["red","hello"] > insert (1,0) "hello" $ lazyGridMap (rectSquareGrid 1 2) ["red","blue"] lazyGridMap (rectSquareGrid 1 2) ["red","hello"] > insert (5,5) "hello" $ lazyGridMap (rectSquareGrid 1 2) ["red","blue"] lazyGridMap (rectSquareGrid 1 2) ["red","blue"]The expression  f k v m will insert the value v into the tile at position kn if the tile does not already contain a value. If the tile does contain a value, it is replaced with  f v old_value`. If the tile is not within the bounds of the grid map, the original grid map is returned. > let m = lazyGridMap (rectSquareGrid 1 2) [100] > insertWith (+) (0,0) 1 m lazyGridMap (rectSquareGrid 1 2) [101] > insertWith (+) (1,0) 1 m lazyGridMap (rectSquareGrid 1 2) [100,1] > insertWith (+) (5,5) 1 m lazyGridMap (rectSquareGrid 1 2) [100]The expression  f k v m will insert the value v into the tile at position kn if the tile does not already contain a value. If the tile does contain a value, it is replaced with f k v old_value`. If the tile is not within the bounds of the grid map, the original grid map is returned. N> let m = lazyGridMap (rectSquareGrid 1 2) ["red"] > let f k x y = show k ++ " " ++ x ++ y > insertWithKey f (0,0) "dark" m lazyGridMap (rectSquareGrid 1 2) ["(0,0) darkred"] > insertWithKey f (1,0) "dark" m lazyGridMap (rectSquareGrid 1 2) ["red","dark"] > insertWithKey f (5,5) "dark" m lazyGridMap (rectSquareGrid 1 2) ["red"] Combines  with ;. The old value is returned, along with the updated map.%Deletes the value at a tile position in the grid map. The tile is not removed from the grid. If the tile is not within the bounds of the grid map, the original grid map is returned. Note: Although this function may remove values, it never removes tiles from the underlying grid. > let m = lazyGridMap (rectSquareGrid 1 2) ["red"] > delete (0,0) m lazyGridMap (rectSquareGrid 1 2) [] > delete (1,0) m lazyGridMap (rectSquareGrid 1 2) ["red"] > delete (5,5) m lazyGridMap (rectSquareGrid 1 2) ["red"]Adjust a value at a specific tile position. If the tile does not contain a value, or is not within the bounds of the grid map, the original grid map is returned. > let m = lazyGridMap (rectSquareGrid 1 2) ["world"] > let f x = "hello " ++ x > adjust f (0,0) m lazyGridMap (rectSquareGrid 1 2) ["hello world"] > adjust f (1,0) m lazyGridMap (rectSquareGrid 1 2) ["world"] > adjust f (5,5) m lazyGridMap (rectSquareGrid 1 2) ["world"]Adjust a value at a specific tile position. If the tile is not within the bounds of the grid map, the original grid map is returned. M> let m = lazyGridMap (rectSquareGrid 1 2) ["world"] > let f k x = "Hello, " ++ x ++ " from " ++ show k > adjustWithKey f (0,0) m lazyGridMap (rectSquareGrid 1 2) ["Hello, world from (0,0)"] > adjustWithKey f (1,0) m lazyGridMap (rectSquareGrid 1 2) ["world"] > adjustWithKey f (5,5) m lazyGridMap (rectSquareGrid 1 2) ["world"]GThe expression (alter f k map) alters the value at k, or absence thereof. If the tile is not within the bounds of the grid map, the original grid map is returned. Can be used to insert, delete, or update a value. Note: Although this function may remove values, it never removes tiles from the underlying grid. > let m = lazyGridMap (rectSquareGrid 1 2) ["red"] > let f _ = Nothing > alter f (1,0) m lazyGridMap (rectSquareGrid 1 2) ["red"] > alter f (0,0) m -- deleting a value lazyGridMap (rectSquareGrid 1 2) [] > alter f (5,5) m lazyGridMap (rectSquareGrid 1 2) ["red"] > let f _ = Just "hi!" > alter f (1,0) m -- inserting a value lazyGridMap (rectSquareGrid 1 2) ["red","hi!"] > alter f (0,0) m -- updating a value lazyGridMap (rectSquareGrid 1 2) ["hi!"] > alter f (5,5) m lazyGridMap (rectSquareGrid 1 2) ["red"]The expression ( def k map)' returns the value at tile position k or returns def; when the tile is not within the bounds of the grid map. > let m = lazyGridMap (rectSquareGrid 1 2) ["red"] > findWithDefault "yellow" (0,0) m "red" > findWithDefault "yellow" (1,0) m "yellow" > findWithDefault "yellow" (5,5) m "yellow"Returns the position of all tiles in the map that contain a value. To get a list of all tiles in the map regardless of whether or not they contain values, use .Returns all values in the map.+Maps a function over all values in the map. > Math.Geometry.GridMap.map (++ "!") $ lazyGridMap (rectSquareGrid 1 3) ["red","blue"] lazyGridMap (rectSquareGrid 1 3) ["red!","blue!"]+Maps a function over all values in the map. > let f k v = v ++ "@" ++ show k > mapWithKey f $ lazyGridMap (rectSquareGrid 1 3) ["red","blue"] lazyGridMap (rectSquareGrid 1 3) ["red@(0,0)","blue@(1,0)"]Return a map containing only the values that satisfy the predicate. Note: Although this function may remove values, it never removes tiles from the underlying grid. > Math.Geometry.GridMap.filter (> 100) $ lazyGridMap (rectSquareGrid 1 4) [99, 100, 101, 102] lazyGridMap (rectSquareGrid 1 4) [101,102]Return a map containing only the values that satisfy the predicate, which may depend on a tile's index as well as its value. Note: Although this function may remove values, it never removes tiles from the underlying grid. > let f k v = k > (2,0) && v > 100 > filterWithKey f $ lazyGridMap (rectSquareGrid 1 4) [99, 100, 101, 102] lazyGridMap (rectSquareGrid 1 4) [102](c) Amy de Buitlir 2012-2015 BSD-styleamy@nualeargais.ie experimentalportable Safe-Inferred 02346=K.A map from tile positions in a grid to values.]Construct a grid map which is strict in the keys (tile positions), but lazy in the values.   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOOPPQQRRSSTTUUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\YWXZ[W\XZY[W\XZY[ grid-7.7.0Math.Geometry.GridMapMath.Geometry.GridInternal%Math.Geometry.Grid.TriangularInternal!Math.Geometry.Grid.SquareInternal$Math.Geometry.Grid.HexagonalInternal%Math.Geometry.Grid.HexagonalInternal2$Math.Geometry.Grid.OctagonalInternalMath.Geometry.GridMap.LazyMath.Geometry.Grid.TriangularMath.Geometry.Grid.SquareMath.Geometry.Grid.HexagonalMath.Geometry.Grid.Hexagonal2Math.Geometry.Grid.OctagonalMath.Geometry.Gridindicescontainers-0.5.5.1 Data.Map.Basefoldl'foldlfoldr'foldr WrappedGrid normalise denormalise BoundedGrid tileSideCountboundary isBoundarycentreisCentredefaultBoundarydefaultIsBoundary defaultCentredefaultIsCentre FiniteGridSizesizemaxPossibleDistanceGridIndex Directiondistance minDistance neighboursneighboursOfSet neighbour numNeighbourscontains tileCountnullnonNulledges viewpoint isAdjacentadjacentTilesToward minimalPaths directionTodefaultMinDistancedefaultNeighboursdefaultNeighboursOfSetdefaultNeighbourdefaultTileCount defaultEdgesdefaultIsAdjacentdefaultAdjacentTilesTowarddefaultMinimalPathsneighboursBasedOndistanceBasedOndirectionToBasedOnneighboursWrappedBasedOnneighbourWrappedBasedOndistanceWrappedBasedOndirectionToWrappedBasedOnsameEdge adjacentEdgescartesianIndicescartesianCentrecartesianMidpoints XCylTriGrid YCylTriGrid TorTriGrid RectTriGrid ParaTriGrid TriTriGridUnboundedTriGrid TriDirection Southwest SoutheastNorth Northeast NorthwestSouthtriZ inTriTriGrid triTriGrid paraTriGridparallelogramIndices rectTriGrid torTriGrid yCylTriGrid xCylTriGrid$fWrappedGridXCylTriGrid$fFiniteGridXCylTriGrid$fGridXCylTriGrid$fShowXCylTriGrid$fWrappedGridYCylTriGrid$fFiniteGridYCylTriGrid$fGridYCylTriGrid$fShowYCylTriGrid$fWrappedGridTorTriGrid$fFiniteGridTorTriGrid$fGridTorTriGrid$fShowTorTriGrid$fBoundedGridRectTriGrid$fFiniteGridRectTriGrid$fGridRectTriGrid$fShowRectTriGrid$fBoundedGridParaTriGrid$fFiniteGridParaTriGrid$fGridParaTriGrid$fShowParaTriGrid$fBoundedGridTriTriGrid$fFiniteGridTriTriGrid$fGridTriTriGrid$fShowTriTriGrid$fGridUnboundedTriGrid TorSquareGridRectSquareGridUnboundedSquareGridSquareDirectionWestEastrectSquareGrid torSquareGrid$fWrappedGridTorSquareGrid$fFiniteGridTorSquareGrid$fGridTorSquareGrid$fShowTorSquareGrid$fBoundedGridRectSquareGrid$fFiniteGridRectSquareGrid$fGridRectSquareGrid$fShowRectSquareGrid$fGridUnboundedSquareGrid ParaHexGrid HexHexGridUnboundedHexGrid HexDirection hexHexGrid paraHexGrid$fBoundedGridParaHexGrid$fFiniteGridParaHexGrid$fGridParaHexGrid$fShowParaHexGrid$fBoundedGridHexHexGrid$fFiniteGridHexHexGrid$fGridHexHexGrid$fShowHexHexGrid$fGridUnboundedHexGrid RectHexGrid rectHexGrid rectHexGridY$fBoundedGridRectHexGrid$fFiniteGridRectHexGrid$fGridRectHexGrid$fShowRectHexGrid TorOctGrid RectOctGridUnboundedOctGrid OctDirection rectOctGrid torOctGrid$fWrappedGridTorOctGrid$fFiniteGridTorOctGrid$fGridTorOctGrid$fShowTorOctGrid$fBoundedGridRectOctGrid$fFiniteGridRectOctGrid$fGridRectOctGrid$fShowRectOctGrid$fGridUnboundedOctGridGridMapBaseGrid!toMaptoGridtoListlookupinsert insertWith insertWithKeyinsertLookupWithKeydeleteadjust adjustWithKeyalterfindWithDefaultkeyselemsmap mapWithKeyfilter filterWithKeyLGridMap lazyGridMapemptylgmGridlgmMap$fShowLGridMap $fEqLGridMap$fGridMapLGridMapv$fFiniteGridLGridMap$fGridLGridMap$fFoldableLGridMap$fFunctorLGridMap