{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_HADDOCK -show-extensions #-}
module Phladiprelio.Halfsplit where
import GHC.Base
import GHC.Enum (fromEnum)
import GHC.Real (quot,quotRem)
import GHC.Num ((+),(-),abs)
import Data.List hiding (foldr)
import GHC.Int (Int8)
import Text.Show (Show(..))
halfsplit
:: (Show a, Eq b)
=> (a -> b)
-> Int8
-> [a]
-> String
halfsplit :: forall a b. (Show a, Eq b) => (a -> b) -> Int8 -> [a] -> [Char]
halfsplit a -> b
g Int8
m [a]
xs
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
xs = []
| Bool
otherwise =
let (Int
n, Int
rr2) = forall a. Integral a => a -> a -> (a, a)
quotRem (forall a. Enum a => a -> Int
fromEnum Int8
m) (if Int8
m forall a. Ord a => a -> a -> Bool
< Int8
0 then -Int
10 else Int
10)
r :: ([[Char]], [[Char]])
r =
case forall a. Num a => a -> a
abs Int
rr2 of
Int
1 -> let us :: [a]
us = forall a. [a] -> [a]
reverse [a]
ts in (if Int
rrr forall a. Eq a => a -> a -> Bool
== Int
0 then forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [a]
ys else forall a. Int -> a -> [a]
replicate Int
l0 Char
' 'forall a. a -> [a] -> [a]
:forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [a]
ys, forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [a]
us)
Int
2 -> let us :: [[[Char]]]
us = (forall a. Int -> a -> [a]
replicate (Int
lt1 forall a. Num a => a -> a -> a
- Int
ly1) [forall a. Int -> a -> [a]
replicate Int
l0 Char
' ']) forall a. Monoid a => a -> a -> a
`mappend` forall a. [a] -> [a]
reverse (forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> [a]
reverse [[[Char]]]
y1s) in (forall a. Monoid a => [a] -> a
mconcat [[[Char]]]
us, forall a. Monoid a => [a] -> a
mconcat [[[Char]]]
t1s)
Int
3 -> let us :: [[[Char]]]
us = (forall a. Int -> a -> [a]
replicate (Int
lt1 forall a. Num a => a -> a -> a
- Int
ly1) [forall a. Int -> a -> [a]
replicate Int
l0 Char
' ']) forall a. Monoid a => a -> a -> a
`mappend` [[[Char]]]
y1s
ks :: [[[Char]]]
ks = forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> [a]
reverse forall a b. (a -> b) -> a -> b
$ [[[Char]]]
t1s in (forall a. Monoid a => [a] -> a
mconcat [[[Char]]]
us, forall a. Monoid a => [a] -> a
mconcat [[[Char]]]
ks)
Int
4 -> let us :: [[[Char]]]
us = (forall a. Int -> a -> [a]
replicate (Int
lt2 forall a. Num a => a -> a -> a
- Int
ly2) [forall a. Int -> a -> [a]
replicate Int
l0 Char
' ']) forall a. Monoid a => a -> a -> a
`mappend` forall a. [a] -> [a]
reverse (forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> [a]
reverse [[[Char]]]
y2s) in (forall a. Monoid a => [a] -> a
mconcat [[[Char]]]
us, forall a. Monoid a => [a] -> a
mconcat [[[Char]]]
t2s)
Int
5 -> let us :: [[[Char]]]
us = (forall a. Int -> a -> [a]
replicate (Int
lt2 forall a. Num a => a -> a -> a
- Int
ly2) [forall a. Int -> a -> [a]
replicate Int
l0 Char
' ']) forall a. Monoid a => a -> a -> a
`mappend` [[[Char]]]
y2s
ks :: [[[Char]]]
ks = forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> [a]
reverse forall a b. (a -> b) -> a -> b
$ [[[Char]]]
t2s in (forall a. Monoid a => [a] -> a
mconcat [[[Char]]]
us, forall a. Monoid a => [a] -> a
mconcat [[[Char]]]
ks)
Int
_ -> let us :: [a]
us = forall a. [a] -> [a]
reverse [a]
ys in (if Int
rrr forall a. Eq a => a -> a -> Bool
== Int
0 then forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [a]
us else forall a. Int -> a -> [a]
replicate Int
l0 Char
' 'forall a. a -> [a] -> [a]
:forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [a]
us, forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [a]
ts) in (\([[Char]]
rs, [[Char]]
qs) -> Int -> [Char] -> [[Char]] -> [[Char]] -> [Char]
mergePartsLine Int
n [Char]
"\n" [[Char]]
rs [[Char]]
qs) forall a b. (a -> b) -> a -> b
$ ([[Char]], [[Char]])
r
where ([a]
ys,[a]
ts) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
l [a]
xs
(Int
l,Int
rrr) = forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs forall a. Integral a => a -> a -> (a, a)
`quotRem` Int
2
l0 :: Int
l0 = forall (t :: * -> *) a. Foldable t => t a -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> [Char]
show forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ [a]
xs
rss :: [[[Char]]]
rss = forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy (\a
x a
y -> a -> b
g a
x forall a. Eq a => a -> a -> Bool
== a -> b
g a
y) forall a b. (a -> b) -> a -> b
$ [a]
xs
r1ss :: [[[Char]]]
r1ss = forall a. a -> [a] -> [a]
intersperse [forall a. Int -> a -> [a]
replicate Int
l0 Char
' '] [[[Char]]]
rss
l2 :: Int
l2 = (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ [[[Char]]]
rss) forall a. Integral a => a -> a -> a
`quot` Int
2
l3 :: Int
l3 = (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ [[[Char]]]
r1ss) forall a. Integral a => a -> a -> a
`quot` Int
2
([[[Char]]]
y1s,[[[Char]]]
t1s,Int
_) = forall a. Int -> [[a]] -> ([[a]], [[a]], Int)
splitGroups Int
l2 [[[Char]]]
rss
ly1 :: Int
ly1 = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ [[[Char]]]
y1s
lt1 :: Int
lt1 = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ [[[Char]]]
t1s
([[[Char]]]
y2s,[[[Char]]]
t2s,Int
_) = forall a. Int -> [[a]] -> ([[a]], [[a]], Int)
splitGroups Int
l3 [[[Char]]]
r1ss
ly2 :: Int
ly2 = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ [[[Char]]]
y2s
lt2 :: Int
lt2 = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ [[[Char]]]
t2s
mergePartsLine :: Int -> String -> [String] -> [String] -> String
mergePartsLine :: Int -> [Char] -> [[Char]] -> [[Char]] -> [Char]
mergePartsLine Int
n [Char]
newlined [[Char]]
xs [[Char]]
ys = forall a. [a] -> [[a]] -> [a]
intercalate [Char]
newlined forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\[Char]
x [Char]
y -> [Char]
x forall a. Monoid a => a -> a -> a
`mappend` (forall a. Int -> a -> [a]
replicate Int
n (if Int
n forall a. Ord a => a -> a -> Bool
< Int
0 then Char
'\t' else Char
' ')) forall a. Monoid a => a -> a -> a
`mappend` [Char]
y) [[Char]]
xs forall a b. (a -> b) -> a -> b
$ [[Char]]
ys
splitGroups :: Int -> [[a]] -> ([[a]], [[a]], Int)
splitGroups :: forall a. Int -> [[a]] -> ([[a]], [[a]], Int)
splitGroups Int
l [[a]]
tss = forall a b. (a -> b -> b) -> b -> [a] -> b
foldr forall {t :: * -> *} {a}.
Foldable t =>
t a -> ([t a], [t a], Int) -> ([t a], [t a], Int)
h ([],[],Int
0) [[a]]
tss
where h :: t a -> ([t a], [t a], Int) -> ([t a], [t a], Int)
h t a
js ([t a]
rss,[t a]
mss,Int
k)
| Int
k forall a. Ord a => a -> a -> Bool
< Int
l = ([t a]
rss, t a
jsforall a. a -> [a] -> [a]
:[t a]
mss, Int
k forall a. Num a => a -> a -> a
+ forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
js)
| Bool
otherwise = (t a
js forall a. a -> [a] -> [a]
: [t a]
rss, [t a]
mss, Int
k forall a. Num a => a -> a -> a
+ forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
js)
showWithSpaces :: (Show a) => Int -> a -> String
showWithSpaces :: forall a. Show a => Int -> a -> [Char]
showWithSpaces Int
n a
x
| Int
l forall a. Ord a => a -> a -> Bool
< Int
n = [Char]
xs forall a. Monoid a => a -> a -> a
`mappend` forall a. Int -> a -> [a]
replicate (Int
n forall a. Num a => a -> a -> a
- Int
l) Char
' '
| Bool
otherwise = [Char]
xs
where xs :: [Char]
xs = forall a. Show a => a -> [Char]
show a
x
l :: Int
l = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Char]
xs