-- |
-- Module      : Data.Semigroup.Numbered
-- Copyright   : (c) Justus Sagemüller 2017
-- License     : LGPL v3
-- 
-- Maintainer  : (@) justussa $ kth.se
-- Stability   : experimental
-- Portability : portable
-- 

{-# LANGUAGE DataKinds, KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses     #-}
{-# LANGUAGE ConstraintKinds           #-}
{-# LANGUAGE FlexibleContexts          #-}
{-# LANGUAGE FlexibleInstances         #-}

module Data.Semigroup.Numbered ( SemigroupNo(..)
                               -- * The common directions
                               , SemigroupX, SemigroupY, SemigroupZ
                               -- * Infix ops (diagrams/hmatrix style)
                               , (|||), (===)
                               -- * Infix ops (ASCII-art style)
                               , (│), (──), (■), (┃), (━━), (██)
                               ) 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
   -- Adapted from
   -- http://hackage.haskell.org/package/base-4.10.0.0/docs/src/Data.Semigroup.html#Semigroup
  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 
-- | Horizontal concatenation. Fixity as of
--   <http://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Semigroup.html#v:-60--62- the standard semigroup>.
--
--   @U+2502@ / Vim digraph @vv@.
(│) :: 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 
-- | Horizontal concatenation. @U+2503@ / Vim digraph @VV@.
(┃) :: 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 |||
-- | Horizontal concatenation. Fixity as
--   <http://hackage.haskell.org/package/diagrams-lib-1.4.1.2/docs/Diagrams-TwoD-Combinators.html#v:-61--61--61- in diagrams>.
(|||) :: 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 ──
-- | Vertical concatenation. @U+2500@ / Vim digraph @hh@.
(──) :: 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 ━━
-- | Vertical concatenation. @U+2501@ / Vim digraph @HH@.
(━━) :: 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 ===
-- | Vertical concatenation. Fixity as
--   <http://hackage.haskell.org/package/diagrams-lib-1.4.1.2/docs/Diagrams-TwoD-Combinators.html#v:-124--124--124- in diagrams>.
(===) :: 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 
-- | z-concatenation. @U+25A0@ / Vim digraph @fS@.
(■) :: 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 ██
-- | z-concatenation. @U+254B@ / Vim digraph @FB@.
(██) :: 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)