{-# LANGUAGE DataKinds, KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
module Data.Semigroup.Numbered ( SemigroupNo(..)
, SemigroupX, SemigroupY, SemigroupZ
, (|||), (===)
, (│), (──), (■), (┃), (━━), (██)
) where
import GHC.TypeLits
import qualified Data.List.NonEmpty as NE
import qualified Data.Foldable as Foldable
import Data.Proxy
import Data.Void
import Control.Applicative
import Data.CallStack (HasCallStack)
class SemigroupNo (n :: Nat) g where
{-# MINIMAL sappendN | sconcatN #-}
sappendN :: proxy n -> g -> g -> g
sappendN proxy n
p g
x g
y = proxy n -> NonEmpty g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> NonEmpty g -> g
forall (proxy :: Nat -> *). proxy n -> NonEmpty g -> g
sconcatN proxy n
p (NonEmpty g -> g) -> NonEmpty g -> g
forall a b. (a -> b) -> a -> b
$ g
x g -> [g] -> NonEmpty g
forall a. a -> [a] -> NonEmpty a
NE.:|[g
y]
sconcatN :: proxy n -> NE.NonEmpty g -> g
sconcatN = (g -> g -> g) -> NonEmpty g -> g
forall a. (a -> a -> a) -> NonEmpty a -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
Foldable.foldr1 ((g -> g -> g) -> NonEmpty g -> g)
-> (proxy n -> g -> g -> g) -> proxy n -> NonEmpty g -> g
forall b c a. (b -> c) -> (a -> b) -> a -> c
. proxy n -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy n -> g -> g -> g
sappendN
stimesN :: (Integral b, HasCallStack) => proxy n -> b -> g -> g
stimesN proxy n
p b
y₀ g
x₀
| b
y₀ b -> b -> Bool
forall a. Ord a => a -> a -> Bool
<= b
0 = [Char] -> g
forall a. HasCallStack => [Char] -> a
error [Char]
"stimesN: positive multiplier expected"
| Bool
otherwise = g -> b -> g
forall {a}. Integral a => g -> a -> g
f g
x₀ b
y₀
where
f :: g -> a -> g
f g
x a
y
| a -> Bool
forall a. Integral a => a -> Bool
even a
y = g -> a -> g
f (g
x g -> g -> g
<> g
x) (a
y a -> a -> a
forall a. Integral a => a -> a -> a
`quot` a
2)
| a
y a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
1 = g
x
| Bool
otherwise = g -> a -> g -> g
forall {a}. Integral a => g -> a -> g -> g
g (g
x g -> g -> g
<> g
x) (a -> a
forall a. Enum a => a -> a
pred a
y a -> a -> a
forall a. Integral a => a -> a -> a
`quot` a
2) g
x
g :: g -> a -> g -> g
g g
x a
y g
z
| a -> Bool
forall a. Integral a => a -> Bool
even a
y = g -> a -> g -> g
g (g
x g -> g -> g
<> g
x) (a
y a -> a -> a
forall a. Integral a => a -> a -> a
`quot` a
2) g
z
| a
y a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
1 = g
x g -> g -> g
<> g
z
| Bool
otherwise = g -> a -> g -> g
g (g
x g -> g -> g
<> g
x) (a -> a
forall a. Enum a => a -> a
pred a
y a -> a -> a
forall a. Integral a => a -> a -> a
`quot` a
2) (g
x g -> g -> g
<> g
z)
<> :: g -> g -> g
(<>) = proxy n -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy n -> g -> g -> g
sappendN proxy n
p
instance (SemigroupNo n g) => SemigroupNo n (a -> g) where
sappendN :: forall (proxy :: Nat -> *).
proxy n -> (a -> g) -> (a -> g) -> a -> g
sappendN proxy n
p a -> g
f a -> g
g a
x = proxy n -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy n -> g -> g -> g
sappendN proxy n
p (a -> g
f a
x) (a -> g
g a
x)
sconcatN :: forall (proxy :: Nat -> *). proxy n -> NonEmpty (a -> g) -> a -> g
sconcatN proxy n
p NonEmpty (a -> g)
fs a
x = proxy n -> NonEmpty g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> NonEmpty g -> g
forall (proxy :: Nat -> *). proxy n -> NonEmpty g -> g
sconcatN proxy n
p (NonEmpty g -> g) -> NonEmpty g -> g
forall a b. (a -> b) -> a -> b
$ ((a -> g) -> a -> g
forall a b. (a -> b) -> a -> b
$ a
x)((a -> g) -> g) -> NonEmpty (a -> g) -> NonEmpty g
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>NonEmpty (a -> g)
fs
stimesN :: forall b (proxy :: Nat -> *).
(Integral b, HasCallStack) =>
proxy n -> b -> (a -> g) -> a -> g
stimesN proxy n
p b
n a -> g
f = proxy n -> b -> g -> g
forall (n :: Nat) g b (proxy :: Nat -> *).
(SemigroupNo n g, Integral b, HasCallStack) =>
proxy n -> b -> g -> g
forall b (proxy :: Nat -> *).
(Integral b, HasCallStack) =>
proxy n -> b -> g -> g
stimesN proxy n
p b
n (g -> g) -> (a -> g) -> a -> g
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> g
f
instance (SemigroupNo n g) => SemigroupNo n (Maybe g) where
sappendN :: forall (proxy :: Nat -> *).
proxy n -> Maybe g -> Maybe g -> Maybe g
sappendN proxy n
_ Maybe g
Nothing Maybe g
b = Maybe g
b
sappendN proxy n
_ Maybe g
a Maybe g
Nothing = Maybe g
a
sappendN proxy n
p (Just g
a) (Just g
b) = g -> Maybe g
forall a. a -> Maybe a
Just (g -> Maybe g) -> g -> Maybe g
forall a b. (a -> b) -> a -> b
$ proxy n -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy n -> g -> g -> g
sappendN proxy n
p g
a g
b
stimesN :: forall b (proxy :: Nat -> *).
(Integral b, HasCallStack) =>
proxy n -> b -> Maybe g -> Maybe g
stimesN proxy n
_ b
_ Maybe g
Nothing = Maybe g
forall a. Maybe a
Nothing
stimesN proxy n
p b
n (Just g
a) = g -> Maybe g
forall a. a -> Maybe a
Just (g -> Maybe g) -> g -> Maybe g
forall a b. (a -> b) -> a -> b
$ proxy n -> b -> g -> g
forall (n :: Nat) g b (proxy :: Nat -> *).
(SemigroupNo n g, Integral b, HasCallStack) =>
proxy n -> b -> g -> g
forall b (proxy :: Nat -> *).
(Integral b, HasCallStack) =>
proxy n -> b -> g -> g
stimesN proxy n
p b
n g
a
instance SemigroupNo n () where
sappendN :: forall (proxy :: Nat -> *). proxy n -> () -> () -> ()
sappendN proxy n
_ () () = ()
sconcatN :: forall (proxy :: Nat -> *). proxy n -> NonEmpty () -> ()
sconcatN proxy n
_ NonEmpty ()
_ = ()
stimesN :: forall b (proxy :: Nat -> *).
(Integral b, HasCallStack) =>
proxy n -> b -> () -> ()
stimesN proxy n
_ b
_ () = ()
instance SemigroupNo n (Proxy x) where
sappendN :: forall (proxy :: Nat -> *).
proxy n -> Proxy x -> Proxy x -> Proxy x
sappendN proxy n
_ Proxy x
Proxy Proxy x
Proxy = Proxy x
forall {k} (t :: k). Proxy t
Proxy
sconcatN :: forall (proxy :: Nat -> *).
proxy n -> NonEmpty (Proxy x) -> Proxy x
sconcatN proxy n
_ NonEmpty (Proxy x)
_ = Proxy x
forall {k} (t :: k). Proxy t
Proxy
stimesN :: forall b (proxy :: Nat -> *).
(Integral b, HasCallStack) =>
proxy n -> b -> Proxy x -> Proxy x
stimesN proxy n
_ b
_ Proxy x
Proxy = Proxy x
forall {k} (t :: k). Proxy t
Proxy
instance SemigroupNo n Void where
sappendN :: forall (proxy :: Nat -> *). proxy n -> Void -> Void -> Void
sappendN proxy n
_ = Void -> Void -> Void
forall a. Void -> a
absurd
stimesN :: forall b (proxy :: Nat -> *).
(Integral b, HasCallStack) =>
proxy n -> b -> Void -> Void
stimesN proxy n
_ b
_ = Void -> Void
forall a. Void -> a
absurd
instance SemigroupNo 0 [Void] where sappendN :: forall (proxy :: Nat -> *). proxy 0 -> [Void] -> [Void] -> [Void]
sappendN proxy 0
_ [] [] = []
instance SemigroupNo 0 [()] where sappendN :: forall (proxy :: Nat -> *). proxy 0 -> [()] -> [()] -> [()]
sappendN proxy 0
_ = [()] -> [()] -> [()]
forall a. [a] -> [a] -> [a]
(++)
instance SemigroupNo 0 [Char] where sappendN :: forall (proxy :: Nat -> *). proxy 0 -> [Char] -> [Char] -> [Char]
sappendN proxy 0
_ = [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
(++)
instance SemigroupNo 0 [Int] where sappendN :: forall (proxy :: Nat -> *). proxy 0 -> [Int] -> [Int] -> [Int]
sappendN proxy 0
_ = [Int] -> [Int] -> [Int]
forall a. [a] -> [a] -> [a]
(++)
instance SemigroupNo 0 [Integer] where sappendN :: forall (proxy :: Nat -> *).
proxy 0 -> [Integer] -> [Integer] -> [Integer]
sappendN proxy 0
_ = [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
(++)
instance SemigroupNo 0 [Float] where sappendN :: forall (proxy :: Nat -> *).
proxy 0 -> [Float] -> [Float] -> [Float]
sappendN proxy 0
_ = [Float] -> [Float] -> [Float]
forall a. [a] -> [a] -> [a]
(++)
instance SemigroupNo 0 [Double] where sappendN :: forall (proxy :: Nat -> *).
proxy 0 -> [Double] -> [Double] -> [Double]
sappendN proxy 0
_ = [Double] -> [Double] -> [Double]
forall a. [a] -> [a] -> [a]
(++)
instance SemigroupNo 0 [Rational] where sappendN :: forall (proxy :: Nat -> *).
proxy 0 -> [Rational] -> [Rational] -> [Rational]
sappendN proxy 0
_ = [Rational] -> [Rational] -> [Rational]
forall a. [a] -> [a] -> [a]
(++)
instance SemigroupNo 0 [Maybe a] where sappendN :: forall (proxy :: Nat -> *).
proxy 0 -> [Maybe a] -> [Maybe a] -> [Maybe a]
sappendN proxy 0
_ = [Maybe a] -> [Maybe a] -> [Maybe a]
forall a. [a] -> [a] -> [a]
(++)
instance (SemigroupNo 0 [a]) => SemigroupNo 0 [[a]] where
sappendN :: forall (proxy :: Nat -> *). proxy 0 -> [[a]] -> [[a]] -> [[a]]
sappendN proxy 0
_ [] [[a]]
ys = [[a]]
ys
sappendN proxy 0
_ [[a]]
xs [] = [[a]]
xs
sappendN proxy 0
p ([a]
x:[[a]]
xs) ([a]
y:[[a]]
ys) = proxy 0 -> [a] -> [a] -> [a]
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 0 -> [a] -> [a] -> [a]
sappendN proxy 0
p [a]
x [a]
y [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: proxy 0 -> [[a]] -> [[a]] -> [[a]]
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 0 -> [[a]] -> [[a]] -> [[a]]
sappendN proxy 0
p [[a]]
xs [[a]]
ys
instance SemigroupNo 1 [[Void]] where sappendN :: forall (proxy :: Nat -> *).
proxy 1 -> [[Void]] -> [[Void]] -> [[Void]]
sappendN proxy 1
_ = [[Void]] -> [[Void]] -> [[Void]]
forall a. [a] -> [a] -> [a]
(++)
instance SemigroupNo 1 [[()]] where sconcatN :: forall (proxy :: Nat -> *). proxy 1 -> NonEmpty [[()]] -> [[()]]
sconcatN proxy 1
_ = () -> [[()]] -> [[()]]
forall a. a -> [[a]] -> [[a]]
paddedLines () ([[()]] -> [[()]])
-> (NonEmpty [[()]] -> [[()]]) -> NonEmpty [[()]] -> [[()]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [[()]] -> [[()]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
Foldable.concat
instance SemigroupNo 1 [[Char]] where sconcatN :: forall (proxy :: Nat -> *).
proxy 1 -> NonEmpty [[Char]] -> [[Char]]
sconcatN proxy 1
_ = Char -> [[Char]] -> [[Char]]
forall a. a -> [[a]] -> [[a]]
paddedLines Char
' ' ([[Char]] -> [[Char]])
-> (NonEmpty [[Char]] -> [[Char]]) -> NonEmpty [[Char]] -> [[Char]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [[Char]] -> [[Char]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
Foldable.concat
instance SemigroupNo 1 [[Int]] where sconcatN :: forall (proxy :: Nat -> *). proxy 1 -> NonEmpty [[Int]] -> [[Int]]
sconcatN proxy 1
_ = Int -> [[Int]] -> [[Int]]
forall a. a -> [[a]] -> [[a]]
paddedLines Int
0 ([[Int]] -> [[Int]])
-> (NonEmpty [[Int]] -> [[Int]]) -> NonEmpty [[Int]] -> [[Int]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [[Int]] -> [[Int]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
Foldable.concat
instance SemigroupNo 1 [[Integer]] where sconcatN :: forall (proxy :: Nat -> *).
proxy 1 -> NonEmpty [[Integer]] -> [[Integer]]
sconcatN proxy 1
_ = Integer -> [[Integer]] -> [[Integer]]
forall a. a -> [[a]] -> [[a]]
paddedLines Integer
0 ([[Integer]] -> [[Integer]])
-> (NonEmpty [[Integer]] -> [[Integer]])
-> NonEmpty [[Integer]]
-> [[Integer]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [[Integer]] -> [[Integer]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
Foldable.concat
instance SemigroupNo 1 [[Float]] where sconcatN :: forall (proxy :: Nat -> *).
proxy 1 -> NonEmpty [[Float]] -> [[Float]]
sconcatN proxy 1
_ = Float -> [[Float]] -> [[Float]]
forall a. a -> [[a]] -> [[a]]
paddedLines Float
0 ([[Float]] -> [[Float]])
-> (NonEmpty [[Float]] -> [[Float]])
-> NonEmpty [[Float]]
-> [[Float]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [[Float]] -> [[Float]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
Foldable.concat
instance SemigroupNo 1 [[Double]] where sconcatN :: forall (proxy :: Nat -> *).
proxy 1 -> NonEmpty [[Double]] -> [[Double]]
sconcatN proxy 1
_ = Double -> [[Double]] -> [[Double]]
forall a. a -> [[a]] -> [[a]]
paddedLines Double
0 ([[Double]] -> [[Double]])
-> (NonEmpty [[Double]] -> [[Double]])
-> NonEmpty [[Double]]
-> [[Double]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [[Double]] -> [[Double]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
Foldable.concat
instance SemigroupNo 1 [[Rational]] where sconcatN :: forall (proxy :: Nat -> *).
proxy 1 -> NonEmpty [[Rational]] -> [[Rational]]
sconcatN proxy 1
_ = Rational -> [[Rational]] -> [[Rational]]
forall a. a -> [[a]] -> [[a]]
paddedLines Rational
0 ([[Rational]] -> [[Rational]])
-> (NonEmpty [[Rational]] -> [[Rational]])
-> NonEmpty [[Rational]]
-> [[Rational]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [[Rational]] -> [[Rational]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
Foldable.concat
instance SemigroupNo 1 [[Maybe a]] where sconcatN :: forall (proxy :: Nat -> *).
proxy 1 -> NonEmpty [[Maybe a]] -> [[Maybe a]]
sconcatN proxy 1
_ = Maybe a -> [[Maybe a]] -> [[Maybe a]]
forall a. a -> [[a]] -> [[a]]
paddedLines Maybe a
forall a. Maybe a
Nothing ([[Maybe a]] -> [[Maybe a]])
-> (NonEmpty [[Maybe a]] -> [[Maybe a]])
-> NonEmpty [[Maybe a]]
-> [[Maybe a]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty [[Maybe a]] -> [[Maybe a]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
Foldable.concat
instance (SemigroupNo 1 [[a]]) => SemigroupNo 1 [[[a]]] where
sappendN :: forall (proxy :: Nat -> *).
proxy 1 -> [[[a]]] -> [[[a]]] -> [[[a]]]
sappendN proxy 1
_ [] [[[a]]]
ys = [[[a]]]
ys
sappendN proxy 1
_ [[[a]]]
xs [] = [[[a]]]
xs
sappendN proxy 1
p ([[a]]
x:[[[a]]]
xs) ([[a]]
y:[[[a]]]
ys) = proxy 1 -> [[a]] -> [[a]] -> [[a]]
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 1 -> [[a]] -> [[a]] -> [[a]]
sappendN proxy 1
p [[a]]
x [[a]]
y [[a]] -> [[[a]]] -> [[[a]]]
forall a. a -> [a] -> [a]
: proxy 1 -> [[[a]]] -> [[[a]]] -> [[[a]]]
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *).
proxy 1 -> [[[a]]] -> [[[a]]] -> [[[a]]]
sappendN proxy 1
p [[[a]]]
xs [[[a]]]
ys
paddedLines :: a -> [[a]] -> [[a]]
paddedLines :: forall a. a -> [[a]] -> [[a]]
paddedLines a
padr [[a]]
xs = [a] -> [a]
mkPadded ([a] -> [a]) -> [[a]] -> [[a]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [[a]]
xs
where mkPadded :: [a] -> [a]
mkPadded [a]
cs = [a]
cs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ Int -> a -> [a]
forall a. Int -> a -> [a]
replicate (Int
paddingLen Int -> Int -> Int
forall a. Num a => a -> a -> a
- [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
cs) a
padr
paddingLen :: Int
paddingLen = [Int] -> Int
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum ([Int] -> Int) -> [Int] -> Int
forall a b. (a -> b) -> a -> b
$ [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([a] -> Int) -> [[a]] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [[a]]
xs
type SemigroupX = SemigroupNo 0
infixr 6 │
(│) :: SemigroupX g => g -> g -> g
│ :: forall g. SemigroupX g => g -> g -> g
(│) = Proxy 0 -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 0 -> g -> g -> g
sappendN (Proxy 0
forall {k} (t :: k). Proxy t
Proxy :: Proxy 0)
infixr 3 ┃
(┃) :: SemigroupX g => g -> g -> g
┃ :: forall g. SemigroupX g => g -> g -> g
(┃) = Proxy 0 -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 0 -> g -> g -> g
sappendN (Proxy 0
forall {k} (t :: k). Proxy t
Proxy :: Proxy 0)
infixl 6 |||
(|||) :: SemigroupX g => g -> g -> g
||| :: forall g. SemigroupX g => g -> g -> g
(|||) = Proxy 0 -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 0 -> g -> g -> g
sappendN (Proxy 0
forall {k} (t :: k). Proxy t
Proxy :: Proxy 0)
type SemigroupY = SemigroupNo 1
infixr 5 ──
(──) :: SemigroupY g => g -> g -> g
── :: forall g. SemigroupY g => g -> g -> g
(──) = Proxy 1 -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 1 -> g -> g -> g
sappendN (Proxy 1
forall {k} (t :: k). Proxy t
Proxy :: Proxy 1)
infixr 2 ━━
(━━) :: SemigroupY g => g -> g -> g
━━ :: forall g. SemigroupY g => g -> g -> g
(━━) = Proxy 1 -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 1 -> g -> g -> g
sappendN (Proxy 1
forall {k} (t :: k). Proxy t
Proxy :: Proxy 1)
infixl 6 ===
(===) :: SemigroupY g => g -> g -> g
=== :: forall g. SemigroupY g => g -> g -> g
(===) = Proxy 1 -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 1 -> g -> g -> g
sappendN (Proxy 1
forall {k} (t :: k). Proxy t
Proxy :: Proxy 1)
type SemigroupZ = SemigroupNo 2
infixr 4 ■
(■) :: SemigroupZ g => g -> g -> g
■ :: forall g. SemigroupZ g => g -> g -> g
(■) = Proxy 2 -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 2 -> g -> g -> g
sappendN (Proxy 2
forall {k} (t :: k). Proxy t
Proxy :: Proxy 2)
infixr 1 ██
(██) :: SemigroupZ g => g -> g -> g
██ :: forall g. SemigroupZ g => g -> g -> g
(██) = Proxy 2 -> g -> g -> g
forall (n :: Nat) g (proxy :: Nat -> *).
SemigroupNo n g =>
proxy n -> g -> g -> g
forall (proxy :: Nat -> *). proxy 2 -> g -> g -> g
sappendN (Proxy 2
forall {k} (t :: k). Proxy t
Proxy :: Proxy 2)