Safe Haskell | None |
---|---|
Language | Haskell2010 |
Data.Grid.Internal.Grid
Synopsis
- newtype Grid (dims :: [Nat]) a = Grid {}
- type IsGrid dims = (AllC KnownNat dims, SingI dims, Sizable dims, Representable (Grid dims), Enum (Coord dims), Bounded (Coord dims), Neighboring dims)
- data Coord (dims :: [Nat])
- type family NestedLists (dims :: [Nat]) a where ...
- generate :: forall dims a. IsGrid dims => (Int -> a) -> Grid dims a
- toNestedLists :: forall dims a. IsGrid dims => Grid dims a -> NestedLists dims a
- fromNestedLists :: forall dims a. IsGrid dims => NestedLists dims a -> Maybe (Grid dims a)
- fromNestedLists' :: forall dims a. IsGrid dims => NestedLists dims a -> Grid dims a
- fromList :: forall dims a. IsGrid dims => [a] -> Maybe (Grid dims a)
- fromList' :: forall dims a. IsGrid dims => [a] -> Grid dims a
- (//) :: forall dims a. IsGrid dims => Grid dims a -> [(Coord dims, a)] -> Grid dims a
- class Neighboring dims where
- neighborCoords :: Grid dims (Coord dims)
- joinGrid :: Grid dims (Grid ns a) -> Grid (dims ++ ns) a
- splitGrid :: forall outer inner a from. (IsGrid from, IsGrid inner, IsGrid outer, NestedLists from a ~ NestedLists outer (NestedLists inner a)) => Grid from a -> Grid outer (Grid inner a)
Documentation
newtype Grid (dims :: [Nat]) a Source #
An grid of arbitrary dimensions.
e.g. a Grid [2, 3] Int
might look like:
generate id :: Grid [2, 3] Int fromNestedLists [[0,1,2], [3,4,5]]
Instances
Functor (Grid dims) Source # | |
IsGrid dims => Applicative (Grid dims) Source # | |
Foldable (Grid dims) Source # | |
Defined in Data.Grid.Internal.Grid Methods fold :: Monoid m => Grid dims m -> m # foldMap :: Monoid m => (a -> m) -> Grid dims a -> m # foldr :: (a -> b -> b) -> b -> Grid dims a -> b # foldr' :: (a -> b -> b) -> b -> Grid dims a -> b # foldl :: (b -> a -> b) -> b -> Grid dims a -> b # foldl' :: (b -> a -> b) -> b -> Grid dims a -> b # foldr1 :: (a -> a -> a) -> Grid dims a -> a # foldl1 :: (a -> a -> a) -> Grid dims a -> a # toList :: Grid dims a -> [a] # length :: Grid dims a -> Int # elem :: Eq a => a -> Grid dims a -> Bool # maximum :: Ord a => Grid dims a -> a # minimum :: Ord a => Grid dims a -> a # | |
Traversable (Grid dims) Source # | |
Defined in Data.Grid.Internal.Grid | |
IsGrid dims => Distributive (Grid dims) Source # | |
Defined in Data.Grid.Internal.Grid | |
IsGrid dims => Representable (Grid dims) Source # | |
Eq a => Eq (Grid dims a) Source # | |
(Num n, IsGrid dims) => Num (Grid dims n) Source # | |
Defined in Data.Grid.Internal.Grid Methods (+) :: Grid dims n -> Grid dims n -> Grid dims n # (-) :: Grid dims n -> Grid dims n -> Grid dims n # (*) :: Grid dims n -> Grid dims n -> Grid dims n # negate :: Grid dims n -> Grid dims n # abs :: Grid dims n -> Grid dims n # signum :: Grid dims n -> Grid dims n # fromInteger :: Integer -> Grid dims n # | |
(PrettyList (NestedLists dims a), IsGrid dims, Show (NestedLists dims a)) => Show (Grid dims a) Source # | |
(IsGrid dims, Semigroup a) => Semigroup (Grid dims a) Source # | |
(IsGrid dims, Monoid a) => Monoid (Grid dims a) Source # | |
NFData a => NFData (Grid dims a) Source # | |
Defined in Data.Grid.Internal.Grid | |
type Rep (Grid dims) Source # | |
Defined in Data.Grid.Internal.Grid |
type IsGrid dims = (AllC KnownNat dims, SingI dims, Sizable dims, Representable (Grid dims), Enum (Coord dims), Bounded (Coord dims), Neighboring dims) Source #
data Coord (dims :: [Nat]) Source #
The index type for Grid
s.
Instances
IsList (Coord dims) Source # | |
(KnownNat n, Bounded (Coord ns)) => Bounded (Coord (n ': ns)) Source # | |
Bounded (Coord ([] :: [Nat])) Source # | |
(KnownNat x, KnownNat y, Sizable (y ': rest), Bounded (Coord rest), Enum (Coord (y ': rest))) => Enum (Coord (x ': (y ': rest))) Source # | |
Defined in Data.Grid.Internal.Coord Methods succ :: Coord (x ': (y ': rest)) -> Coord (x ': (y ': rest)) # pred :: Coord (x ': (y ': rest)) -> Coord (x ': (y ': rest)) # toEnum :: Int -> Coord (x ': (y ': rest)) # fromEnum :: Coord (x ': (y ': rest)) -> Int # enumFrom :: Coord (x ': (y ': rest)) -> [Coord (x ': (y ': rest))] # enumFromThen :: Coord (x ': (y ': rest)) -> Coord (x ': (y ': rest)) -> [Coord (x ': (y ': rest))] # enumFromTo :: Coord (x ': (y ': rest)) -> Coord (x ': (y ': rest)) -> [Coord (x ': (y ': rest))] # enumFromThenTo :: Coord (x ': (y ': rest)) -> Coord (x ': (y ': rest)) -> Coord (x ': (y ': rest)) -> [Coord (x ': (y ': rest))] # | |
KnownNat n => Enum (Coord (n ': ([] :: [Nat]))) Source # | |
Defined in Data.Grid.Internal.Coord Methods succ :: Coord (n ': []) -> Coord (n ': []) # pred :: Coord (n ': []) -> Coord (n ': []) # toEnum :: Int -> Coord (n ': []) # fromEnum :: Coord (n ': []) -> Int # enumFrom :: Coord (n ': []) -> [Coord (n ': [])] # enumFromThen :: Coord (n ': []) -> Coord (n ': []) -> [Coord (n ': [])] # enumFromTo :: Coord (n ': []) -> Coord (n ': []) -> [Coord (n ': [])] # enumFromThenTo :: Coord (n ': []) -> Coord (n ': []) -> Coord (n ': []) -> [Coord (n ': [])] # | |
Eq (Coord dims) Source # | |
Enum (Coord ns) => Num (Coord ns) Source # | |
Show (Coord dims) Source # | |
type Item (Coord dims) Source # | |
Defined in Data.Grid.Internal.Coord |
type family NestedLists (dims :: [Nat]) a where ... Source #
Computes the level of nesting requried to represent a given grid dimensionality as a nested list
NestedLists [2, 3] Int == [[Int]] NestedLists [2, 3, 4] Int == [[[Int]]]
Equations
NestedLists '[] a = a | |
NestedLists (_ ': xs) a = [NestedLists xs a] |
generate :: forall dims a. IsGrid dims => (Int -> a) -> Grid dims a Source #
Build a grid by selecting an element for each element
toNestedLists :: forall dims a. IsGrid dims => Grid dims a -> NestedLists dims a Source #
Turn a grid into a nested list structure. List nesting increases for each dimension
toNestedLists (G.generate id :: Grid [2, 3] Int) [[0,1,2],[3,4,5]]
fromNestedLists :: forall dims a. IsGrid dims => NestedLists dims a -> Maybe (Grid dims a) Source #
Turn a nested list structure into a Grid if the list is well formed. Required list nesting increases for each dimension
fromNestedLists [[0,1,2],[3,4,5]] :: Maybe (Grid [2, 3] Int) Just (Grid [[0,1,2],[3,4,5]]) fromNestedLists [[0],[1,2]] :: Maybe (Grid [2, 3] Int) Nothing
fromNestedLists' :: forall dims a. IsGrid dims => NestedLists dims a -> Grid dims a Source #
Partial variant of fromNestedLists
which errors on malformed input
fromList :: forall dims a. IsGrid dims => [a] -> Maybe (Grid dims a) Source #
Convert a list into a Grid or fail if not provided the correct number of elements
G.fromList [0, 1, 2, 3, 4, 5] :: Maybe (Grid [2, 3] Int) Just (Grid [[0,1,2],[3,4,5]]) G.fromList [0, 1, 2, 3] :: Maybe (Grid [2, 3] Int) Nothing
fromList' :: forall dims a. IsGrid dims => [a] -> Grid dims a Source #
Partial variant of fromList
which errors on malformed input
(//) :: forall dims a. IsGrid dims => Grid dims a -> [(Coord dims, a)] -> Grid dims a Source #
Update elements of a grid
class Neighboring dims where Source #
Methods
neighborCoords :: Grid dims (Coord dims) Source #
Instances
(KnownNat n, Neighboring ns) => Neighboring (n ': ns) Source # | |
Defined in Data.Grid.Internal.Grid Methods neighborCoords :: Grid (n ': ns) (Coord (n ': ns)) Source # | |
IsGrid (n ': ([] :: [Nat])) => Neighboring (n ': ([] :: [Nat])) Source # | |
Defined in Data.Grid.Internal.Grid Methods neighborCoords :: Grid (n ': []) (Coord (n ': [])) Source # |
joinGrid :: Grid dims (Grid ns a) -> Grid (dims ++ ns) a Source #
The inverse of splitGrid
,
joinGrid will nest a grid from:
> Grid outer (Grid inner a) -> Grid (outer ++ inner) a
For example, you can nest a simple 3x3 from smaller [3] grids as follows:
joinGrid (myGrid :: Grid [3] (Grid [3] a)) :: Grid '[3, 3] a
splitGrid :: forall outer inner a from. (IsGrid from, IsGrid inner, IsGrid outer, NestedLists from a ~ NestedLists outer (NestedLists inner a)) => Grid from a -> Grid outer (Grid inner a) Source #
The inverse of joinGrid
,
splitGrid outerDims
innerDims will un-nest a grid from:
> Grid (outer ++ inner) a -> Grid outer (Grid inner a)
For example, you can unnest a simple 3x3 as follows:
splitGrid @'[3] @'[3] myGrid :: Grid '[3] (Grid [3] a)