module Examples.Algebraic where

import Proton

pad :: AlgebraicLens String [String] String Int
pad :: p String Int -> p String [String]
pad = (String -> String)
-> ([String] -> Int -> [String])
-> p String Int
-> p String [String]
forall (p :: * -> * -> *) s a b t.
MStrong p =>
(s -> a) -> ([s] -> b -> t) -> Optic p s t a b
listLens String -> String
forall a. a -> a
id [String] -> Int -> [String]
padder
  where
    padder :: [String] -> Int -> [String]
    padder :: [String] -> Int -> [String]
padder xs :: [String]
xs n :: Int
n = (String -> String) -> [String] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\s :: String
s -> Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
n (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Char -> String
forall a. a -> [a]
repeat ' ') [String]
xs

padLength :: AlgebraicLens String [String] Int Int
padLength :: p Int Int -> p String [String]
padLength = (String -> Int)
-> ([String] -> Int -> [String]) -> p Int Int -> p String [String]
forall (p :: * -> * -> *) s a b t.
MStrong p =>
(s -> a) -> ([s] -> b -> t) -> Optic p s t a b
listLens String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String] -> Int -> [String]
padder
  where
    padder :: [String] -> Int -> [String]
    padder :: [String] -> Int -> [String]
padder xs :: [String]
xs n :: Int
n = (String -> String) -> [String] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\s :: String
s -> Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
n (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Char -> String
forall a. a -> [a]
repeat ' ') [String]
xs

-- >>> ["a", "hello", "yo"] & padLength >- maximum
-- ["a    ","hello","yo   "]
-- >>> ["a", "hello", "yo"] & padLength >- minimum
-- ["a","h","y"]

-- >>> ["a", "hello", "yo"] & pad ?. 6
-- ["a     ","hello ","yo    "]
-- >>> ["a", "hello", "yo"] & pad ?. 2
-- ["a ","he","yo"]
-- >>> ["a", "hello", "yo"] & pad >- maximum . fmap length
-- ["a    ","hello","yo   "]
-- >>> ["a", "hello", "yo"] & pad >- minimum . fmap length
-- ["a","h","y"]