{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Diagrams.TwoD.Factorization where
import Data.Char (digitToInt)
import Data.List.Split (chunksOf)
import Data.Maybe (listToMaybe)
import Diagrams.Prelude
primeLayout :: (Renderable (Path V2 n) b, TypeableFloat n)
=> [Colour Double] -> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any
primeLayout :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Colour Double]
-> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any
primeLayout [Colour Double]
_ Integer
2 QDiagram b V2 n Any
d
| QDiagram b V2 n Any -> n
forall n a. (InSpace V2 n a, Enveloped a) => a -> n
width QDiagram b V2 n Any
d n -> n -> Bool
forall a. Ord a => a -> a -> Bool
>= QDiagram b V2 n Any -> n
forall n a. (InSpace V2 n a, Enveloped a) => a -> n
height QDiagram b V2 n Any
d = (QDiagram b V2 n Any
d QDiagram b V2 n Any -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Juxtaposable a, Semigroup a) =>
a -> a -> a
=== n -> QDiagram b V2 n Any
forall (v :: * -> *) n b m.
(Metric v, R2 v, OrderedField n) =>
n -> QDiagram b v n m
strutY (QDiagram b V2 n Any -> n
forall n a. (InSpace V2 n a, Enveloped a) => a -> n
height QDiagram b V2 n Any
d n -> n -> n
forall a. Fractional a => a -> a -> a
/ n
3) QDiagram b V2 n Any -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Juxtaposable a, Semigroup a) =>
a -> a -> a
=== QDiagram b V2 n Any
d QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# QDiagram b V2 n Any -> QDiagram b V2 n Any
forall (v :: * -> *) n t.
(InSpace v n t, R2 v, Transformable t) =>
t -> t
reflectY)
# centerY
| Bool
otherwise = (QDiagram b V2 n Any
d QDiagram b V2 n Any -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Juxtaposable a, Semigroup a) =>
a -> a -> a
||| n -> QDiagram b V2 n Any
forall (v :: * -> *) n b m.
(Metric v, R1 v, OrderedField n) =>
n -> QDiagram b v n m
strutX (QDiagram b V2 n Any -> n
forall n a. (InSpace V2 n a, Enveloped a) => a -> n
width QDiagram b V2 n Any
d n -> n -> n
forall a. Fractional a => a -> a -> a
/ n
3) QDiagram b V2 n Any -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Juxtaposable a, Semigroup a) =>
a -> a -> a
||| QDiagram b V2 n Any
d)
# centerX
primeLayout [Colour Double]
colors Integer
p QDiagram b V2 n Any
d
= ([QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall a. Monoid a => [a] -> a
mconcat ([QDiagram b V2 n Any] -> QDiagram b V2 n Any)
-> [QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall a b. (a -> b) -> a -> b
$
(Integer -> QDiagram b V2 n Any)
-> [Integer] -> [QDiagram b V2 n Any]
forall a b. (a -> b) -> [a] -> [b]
map (\Integer
n -> QDiagram b V2 n Any
d QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall (v :: * -> *) n t.
(InSpace v n t, R2 v, Transformable t) =>
n -> t -> t
translateY n
r QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
n -> t -> t
rotateBy
(Integer -> n
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
nn -> n -> n
forall a. Fractional a => a -> a -> a
/Integer -> n
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
p)) [Integer
0..Integer
pInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
-Integer
1]
)
QDiagram b V2 n Any -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall a. Semigroup a => a -> a -> a
<>
[Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any
colorBars [Colour Double]
colors Integer
p Path V2 n
poly
where poly :: Path V2 n
poly = PolygonOpts n -> Path V2 n
forall n t. (InSpace V2 n t, TrailLike t) => PolygonOpts n -> t
polygon (PolygonOpts n
forall d. Default d => d
with PolygonOpts n -> (PolygonOpts n -> PolygonOpts n) -> PolygonOpts n
forall a b. a -> (a -> b) -> b
& (PolyType n -> Identity (PolyType n))
-> PolygonOpts n -> Identity (PolygonOpts n)
forall n (f :: * -> *).
Functor f =>
(PolyType n -> f (PolyType n))
-> PolygonOpts n -> f (PolygonOpts n)
polyType ((PolyType n -> Identity (PolyType n))
-> PolygonOpts n -> Identity (PolygonOpts n))
-> PolyType n -> PolygonOpts n -> PolygonOpts n
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Int -> n -> PolyType n
forall n. Int -> n -> PolyType n
PolyRegular (Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
p) n
r
PolygonOpts n -> (PolygonOpts n -> PolygonOpts n) -> PolygonOpts n
forall a b. a -> (a -> b) -> b
& (PolyOrientation n -> Identity (PolyOrientation n))
-> PolygonOpts n -> Identity (PolygonOpts n)
forall n (f :: * -> *).
Functor f =>
(PolyOrientation n -> f (PolyOrientation n))
-> PolygonOpts n -> f (PolygonOpts n)
polyOrient ((PolyOrientation n -> Identity (PolyOrientation n))
-> PolygonOpts n -> Identity (PolygonOpts n))
-> PolyOrientation n -> PolygonOpts n -> PolygonOpts n
forall s t a b. ASetter s t a b -> b -> s -> t
.~ PolyOrientation n
forall n. PolyOrientation n
OrientH
)
w :: n
w = n -> n -> n
forall a. Ord a => a -> a -> a
max (QDiagram b V2 n Any -> n
forall n a. (InSpace V2 n a, Enveloped a) => a -> n
width QDiagram b V2 n Any
d) (QDiagram b V2 n Any -> n
forall n a. (InSpace V2 n a, Enveloped a) => a -> n
height QDiagram b V2 n Any
d)
r :: n
r = n
w n -> n -> n
forall a. Num a => a -> a -> a
* n
c n -> n -> n
forall a. Fractional a => a -> a -> a
/ n -> n
forall a. Floating a => a -> a
sin (n
forall a. Floating a => a
tau n -> n -> n
forall a. Fractional a => a -> a -> a
/ (n
2 n -> n -> n
forall a. Num a => a -> a -> a
* Integer -> n
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
p))
c :: n
c = n
0.75
colorBars :: (Renderable (Path V2 n) b, TypeableFloat n)
=> [Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any
colorBars :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any
colorBars [Colour Double]
colors Integer
p Path V2 n
poly | Integer
p Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
<= Integer
11 = Path V2 n -> QDiagram b V2 n Any
forall n t b.
(InSpace V2 n t, ToPath t, TypeableFloat n,
Renderable (Path V2 n) b) =>
t -> QDiagram b V2 n Any
stroke Path V2 n
poly
# fc (colors!!(fromIntegral p `mod` 10))
# lw none
colorBars [Colour Double]
colors Integer
p Path V2 n
poly = QDiagram b V2 n Any
bars QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# Path V2 n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall a n.
(HasStyle a, V a ~ V2, N a ~ n, TypeableFloat n) =>
Path V2 n -> a -> a
clipBy Path V2 n
poly
where
barColors :: [Colour Double]
barColors = (Char -> Colour Double) -> [Char] -> [Colour Double]
forall a b. (a -> b) -> [a] -> [b]
map (([Colour Double]
colors[Colour Double] -> Int -> Colour Double
forall a. HasCallStack => [a] -> Int -> a
!!) (Int -> Colour Double) -> (Char -> Int) -> Char -> Colour Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
digitToInt) (Integer -> [Char]
forall a. Show a => a -> [Char]
show Integer
p)
barW :: n
barW = Path V2 n -> n
forall n a. (InSpace V2 n a, Enveloped a) => a -> n
width Path V2 n
poly n -> n -> n
forall a. Fractional a => a -> a -> a
/ Int -> n
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Colour Double] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Colour Double]
barColors)
barH :: n
barH = Path V2 n -> n
forall n a. (InSpace V2 n a, Enveloped a) => a -> n
height Path V2 n
poly
bars :: QDiagram b V2 n Any
bars = ([QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
Monoid' a) =>
[a] -> a
hcat ([QDiagram b V2 n Any] -> QDiagram b V2 n Any)
-> [QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall a b. (a -> b) -> a -> b
$ (Colour Double -> QDiagram b V2 n Any)
-> [Colour Double] -> [QDiagram b V2 n Any]
forall a b. (a -> b) -> [a] -> [b]
map (\Colour Double
c -> n -> n -> QDiagram b V2 n Any
forall n t. (InSpace V2 n t, TrailLike t) => n -> n -> t
rect n
barW n
barH QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# Colour Double -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Floating n, Typeable n, HasStyle a) =>
Colour Double -> a -> a
fc Colour Double
c QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# Colour Double -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Typeable n, Floating n, HasStyle a) =>
Colour Double -> a -> a
lc Colour Double
c) [Colour Double]
barColors)
# centerX
defaultColors :: [Colour Double]
defaultColors :: [Colour Double]
defaultColors = (Colour Double -> Colour Double)
-> [Colour Double] -> [Colour Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> Colour Double -> Colour Double -> Colour Double
forall a (f :: * -> *).
(Num a, AffineSpace f) =>
a -> f a -> f a -> f a
blend Double
0.1 Colour Double
forall a. (Ord a, Floating a) => Colour a
white)
[Colour Double
forall a. Num a => Colour a
black,Colour Double
forall a. (Ord a, Floating a) => Colour a
red,Colour Double
forall a. (Ord a, Floating a) => Colour a
orange,Colour Double
forall a. (Ord a, Floating a) => Colour a
yellow,Colour Double
forall a. (Ord a, Floating a) => Colour a
green,Colour Double
forall a. (Ord a, Floating a) => Colour a
blue,Colour Double
forall a. (Ord a, Floating a) => Colour a
gray,Colour Double
forall a. (Ord a, Floating a) => Colour a
purple,Colour Double
forall a. (Ord a, Floating a) => Colour a
white,Colour Double
forall a. (Ord a, Floating a) => Colour a
brown]
factorDiagram' :: (Renderable (Path V2 n) b, TypeableFloat n)
=> [Integer] -> QDiagram b V2 n Any
factorDiagram' :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Integer] -> QDiagram b V2 n Any
factorDiagram' = QDiagram b V2 n Any -> QDiagram b V2 n Any
forall (v :: * -> *) n a.
(InSpace v n a, R2 v, Fractional n, Alignable a, HasOrigin a) =>
a -> a
centerXY (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> ([Integer] -> QDiagram b V2 n Any)
-> [Integer]
-> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any -> [Integer] -> QDiagram b V2 n Any
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ([Colour Double]
-> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Colour Double]
-> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any
primeLayout [Colour Double]
defaultColors) (n -> QDiagram b V2 n Any
forall t n.
(TrailLike t, V t ~ V2, N t ~ n, Transformable t) =>
n -> t
circle n
1 QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# Colour Double -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Floating n, Typeable n, HasStyle a) =>
Colour Double -> a -> a
fc Colour Double
forall a. Num a => Colour a
black QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# Measure n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure n
forall n. OrderedField n => Measure n
none)
factorDiagram :: (Renderable (Path V2 n) b, TypeableFloat n)
=> Integer -> QDiagram b V2 n Any
factorDiagram :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Integer -> QDiagram b V2 n Any
factorDiagram = [Integer] -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Integer] -> QDiagram b V2 n Any
factorDiagram' ([Integer] -> QDiagram b V2 n Any)
-> (Integer -> [Integer]) -> Integer -> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> [Integer]
factors
factors :: Integer -> [Integer]
factors :: Integer -> [Integer]
factors Integer
1 = []
factors Integer
n = [Integer] -> (Integer -> [Integer]) -> Maybe Integer -> [Integer]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [Integer
n] (\Integer
a -> Integer
a Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: Integer -> [Integer]
factors (Integer
n Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`div` Integer
a)) Maybe Integer
mf
where
mf :: Maybe Integer
mf = [Integer] -> Maybe Integer
forall a. [a] -> Maybe a
listToMaybe ([Integer] -> Maybe Integer) -> [Integer] -> Maybe Integer
forall a b. (a -> b) -> a -> b
$ (Integer -> Bool) -> [Integer] -> [Integer]
forall a. (a -> Bool) -> [a] -> [a]
filter (\Integer
x -> (Integer
n Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`mod` Integer
x) Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0) [Integer
2 .. Integer
n Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
1]
ensquare
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
ensquare :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
ensquare n
n QDiagram b V2 n Any
d = QDiagram b V2 n Any
d QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# QDiagram b V2 n Any -> QDiagram b V2 n Any
forall (v :: * -> *) n a.
(InSpace v n a, R2 v, Fractional n, Alignable a, HasOrigin a) =>
a -> a
centerXY QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# SizeSpec V2 n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall (v :: * -> *) n a.
(InSpace v n a, HasLinearMap v, Transformable a, Enveloped a) =>
SizeSpec v n -> a -> a
sized (n -> n -> SizeSpec V2 n
forall n. n -> n -> SizeSpec V2 n
dims2D (n
0.8n -> n -> n
forall a. Num a => a -> a -> a
*n
n) (n
0.8n -> n -> n
forall a. Num a => a -> a -> a
*n
n)) QDiagram b V2 n Any -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall a. Semigroup a => a -> a -> a
<> n -> QDiagram b V2 n Any
forall n t. (InSpace V2 n t, TrailLike t) => n -> t
square n
n
fdGrid
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> [[Integer]] -> QDiagram b V2 n Any
fdGrid :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[[Integer]] -> QDiagram b V2 n Any
fdGrid = [QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
Monoid' a) =>
[a] -> a
vcat ([QDiagram b V2 n Any] -> QDiagram b V2 n Any)
-> ([[Integer]] -> [QDiagram b V2 n Any])
-> [[Integer]]
-> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([QDiagram b V2 n Any] -> QDiagram b V2 n Any)
-> [[QDiagram b V2 n Any]] -> [QDiagram b V2 n Any]
forall a b. (a -> b) -> [a] -> [b]
map [QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
Monoid' a) =>
[a] -> a
hcat ([[QDiagram b V2 n Any]] -> [QDiagram b V2 n Any])
-> ([[Integer]] -> [[QDiagram b V2 n Any]])
-> [[Integer]]
-> [QDiagram b V2 n Any]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([Integer] -> [QDiagram b V2 n Any])
-> [[Integer]] -> [[QDiagram b V2 n Any]]
forall a b. (a -> b) -> [a] -> [b]
map (([Integer] -> [QDiagram b V2 n Any])
-> [[Integer]] -> [[QDiagram b V2 n Any]])
-> ((Integer -> QDiagram b V2 n Any)
-> [Integer] -> [QDiagram b V2 n Any])
-> (Integer -> QDiagram b V2 n Any)
-> [[Integer]]
-> [[QDiagram b V2 n Any]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> QDiagram b V2 n Any)
-> [Integer] -> [QDiagram b V2 n Any]
forall a b. (a -> b) -> [a] -> [b]
map) (n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
ensquare n
1 (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> (Integer -> QDiagram b V2 n Any)
-> Integer
-> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Integer -> QDiagram b V2 n Any
factorDiagram)
fdGridList
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> Integer -> QDiagram b V2 n Any
fdGridList :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Integer -> QDiagram b V2 n Any
fdGridList Integer
n = [[Integer]] -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[[Integer]] -> QDiagram b V2 n Any
fdGrid ([[Integer]] -> QDiagram b V2 n Any)
-> ([Integer] -> [[Integer]]) -> [Integer] -> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Integer] -> [[Integer]]
forall e. Int -> [e] -> [[e]]
chunksOf (Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
n) ([Integer] -> QDiagram b V2 n Any)
-> [Integer] -> QDiagram b V2 n Any
forall a b. (a -> b) -> a -> b
$ [Integer
1..Integer
nInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
n]
fdMultTable
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> Integer -> QDiagram b V2 n Any
fdMultTable :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Integer -> QDiagram b V2 n Any
fdMultTable Integer
n = [[Integer]] -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[[Integer]] -> QDiagram b V2 n Any
fdGrid [ [Integer
rInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
c | Integer
c <- [Integer
1 .. Integer
n]] | Integer
r <- [Integer
1 .. Integer
n] ]