module DobutokO.Poetry (
uniq10Poetical4
, uniq10Poetical5
, uniq10PoeticalG
, uniqNPoeticalG
, uniqNPoeticalGN
, uniqNPoeticalVGN
, uniquenessVariantsGN
, uniqMaxPoeticalGN
, uniqNPoetical2GN
, uniqNPoetical2VGN
, uniqNPoeticalUGN_
, uniqNPoeticalUGN
, uniqNPoeticalUGN51_
, uniqNPoeticalUGN51
, uniqMaxPoetical2GN
, uniqNPoetical2GNLine
, uniqMaxPoeticalGNL
, uniqNPoeticalGNL
, uniqNPoeticalVGNL
, uniqMaxPoetical2GNL
, uniqNPoetical2GNL
, uniqNPoetical2GNLineL
, uniqNPoetical2VGNL
, uniqNPoeticalUGNL_
, uniqNPoeticalUGNL
) where
import Data.Char (isPunctuation)
import qualified Data.Vector as V
import Data.List ((\\))
import MMSyn7s
import DobutokO.Poetry.Norms
import DobutokO.Poetry.Auxiliary
import DobutokO.Poetry.UniquenessPeriodsG
import DobutokO.Poetry.StrictV
import DobutokO.Poetry.Basic
uniquenessVariantsGN :: V.Vector ([Int] -> Int) -> String -> V.Vector Uniqueness
uniquenessVariantsGN vN = uniquenessVariants2GN vN (uniquenessPeriods)
{-# INLINE uniquenessVariantsGN #-}
uniqMaxPoeticalGN :: Int -> V.Vector ([Int] -> Int) -> String -> Uniqueness
uniqMaxPoeticalGN k vN = uniqMaxPoetical2GN k vN (uniquenessPeriods)
{-# INLINE uniqMaxPoeticalGN #-}
uniqMaxPoeticalGNL :: V.Vector ([Int] -> Int) -> String -> Uniqueness
uniqMaxPoeticalGNL vN = uniqMaxPoeticalGN (V.length vN) vN
{-# INLINE uniqMaxPoeticalGNL #-}
uniqNPoeticalG :: Int -> ([Int] -> Int) -> String -> IO ()
uniqNPoeticalG n g = uniqNPoeticalGN n 1 (V.singleton g)
{-# INLINE uniqNPoeticalG #-}
uniq10PoeticalG :: ([Int] -> Int) -> String -> IO ()
uniq10PoeticalG = uniqNPoeticalG 10
{-# INLINE uniq10PoeticalG #-}
uniq10Poetical4 :: String -> IO ()
uniq10Poetical4 = uniq10PoeticalG norm4
{-# INLINE uniq10Poetical4 #-}
uniq10Poetical5 :: String -> IO ()
uniq10Poetical5 = uniq10PoeticalG norm5
{-# INLINE uniq10Poetical5 #-}
uniqNPoeticalVNL :: Int -> V.Vector ([Int] -> Int) -> V.Vector Uniqueness -> IO (V.Vector Uniqueness)
uniqNPoeticalVNL n vN = uniqNPoeticalVN n (V.length vN) vN
{-# INLINE uniqNPoeticalVNL #-}
uniqNPoeticalGN :: Int -> Int -> V.Vector ([Int] -> Int) -> String -> IO ()
uniqNPoeticalGN n k vN = uniqNPoetical2GN n k vN (uniquenessPeriods)
{-# INLINE uniqNPoeticalGN #-}
uniqNPoeticalGNL :: Int -> V.Vector ([Int] -> Int) -> String -> IO ()
uniqNPoeticalGNL n vN = uniqNPoetical2GNL n vN (uniquenessPeriods)
{-# INLINE uniqNPoeticalGNL #-}
uniqNPoeticalVGN :: Int -> Int -> V.Vector ([Int] -> Int) -> String -> IO (V.Vector Uniqueness)
uniqNPoeticalVGN n k vN = uniqNPoetical2VGN n k vN (uniquenessPeriods)
{-# INLINE uniqNPoeticalVGN #-}
uniqNPoeticalVGNL :: Int -> V.Vector ([Int] -> Int) -> String -> IO (V.Vector Uniqueness)
uniqNPoeticalVGNL n vN = uniqNPoetical2VGN n (V.length vN) vN (uniquenessPeriods)
{-# INLINE uniqNPoeticalVGNL #-}
uniqMaxPoetical2GN :: Int -> V.Vector ([Int] -> Int) -> (String -> [Int]) -> String -> Uniqueness
uniqMaxPoetical2GN k vN g xs
| compare k (V.length vN) == GT = error "DobutokO.Poetry.uniqMaxPoetical2GN: undefined for that amount of norms. "
| compare k 0 == GT =
let vM = uniquenessVariants2GN vN g xs
maxK = V.maximumBy (\(_,vN0,_) (_,vN1,_) -> compare (V.unsafeIndex vN0 (k - 1)) (V.unsafeIndex vN1 (k - 1))) vM
vK = V.filter (\(_,vN2,_) -> V.unsafeIndex vN2 (k - 1) == ((\(_,vNk,_) -> V.unsafeIndex vNk (k - 1)) maxK)) vM in
uniqMaxPoeticalGNV (k - 1) (V.unsafeSlice 0 (V.length vN - 1) vN) vK
| otherwise = V.maximumBy (\(_,vN0,_) (_,vN1,_) -> compare (V.unsafeIndex vN0 0) (V.unsafeIndex vN1 0)) . uniquenessVariantsGN vN $ xs
uniqMaxPoetical2GNL :: V.Vector ([Int] -> Int) -> (String -> [Int]) -> String -> Uniqueness
uniqMaxPoetical2GNL vN = uniqMaxPoetical2GN (V.length vN) vN
{-# INLINE uniqMaxPoetical2GNL #-}
uniqNPoetical2GN :: Int -> Int -> V.Vector ([Int] -> Int) -> (String -> [Int]) -> String -> IO ()
uniqNPoetical2GN n k vN g xs
| n == 0 = return ()
| otherwise = do
let v = uniquenessVariants2GN vN g xs
if compare (V.length v) n == LT
then V.mapM_ (\x -> putStr ((filter (not . isPunctuation) . lastFrom3 $ x)) >> putStrLn "" ) v
else (uniqInMaxPoeticalN k vN v >>= uniqNPoeticalN (n - 1) k vN)
uniqNPoetical2GNL :: Int -> V.Vector ([Int] -> Int) -> (String -> [Int]) -> String -> IO ()
uniqNPoetical2GNL n vN = uniqNPoetical2GN n (V.length vN) vN
{-# INLINE uniqNPoetical2GNL #-}
uniqNPoetical2GNLine :: Int -> Int -> V.Vector ([Int] -> Int) -> (String -> [Int]) -> String -> IO ()
uniqNPoetical2GNLine n k vN g xs
| n == 0 = putStrLn ""
| otherwise = do
let v = uniquenessVariants2GN vN g xs
if compare (V.length v) n == LT
then V.mapM_ (\x -> putStr ((filter (not . isPunctuation) . lastFrom3 $ x)) >> putStr " " ) v >> putStrLn ""
else (uniqInMaxPoeticalNLine k vN v >>= uniqNPoeticalNLine (n - 1) k vN)
uniqNPoetical2GNLineL :: Int -> V.Vector ([Int] -> Int) -> (String -> [Int]) -> String -> IO ()
uniqNPoetical2GNLineL n vN = uniqNPoetical2GNLine n (V.length vN) vN
{-# INLINE uniqNPoetical2GNLineL #-}
uniqNPoetical2VGN :: Int -> Int -> V.Vector ([Int] -> Int) -> (String -> [Int]) -> String -> IO (V.Vector Uniqueness)
uniqNPoetical2VGN n k vN g xs
| n == 0 = return V.empty
| otherwise = do
let v = uniquenessVariants2GN vN g xs
if compare (V.length v) n == LT then return v else uniqNPoeticalVN n k vN v
uniqNPoetical2VGNL :: Int -> V.Vector ([Int] -> Int) -> (String -> [Int]) -> String -> IO (V.Vector Uniqueness)
uniqNPoetical2VGNL n vN = uniqNPoetical2VGN n (V.length vN) vN
{-# INLINE uniqNPoetical2VGNL #-}
uniqNPoeticalUGN_ :: Int -> Int -> Int -> V.Vector ([Int] -> Int) -> String -> IO ()
uniqNPoeticalUGN_ x n k vN = uniqNPoetical2GN n k vN (uniquenessPeriods2 x)
{-# INLINE uniqNPoeticalUGN_ #-}
uniqNPoeticalUGNL_ :: Int -> Int -> V.Vector ([Int] -> Int) -> String -> IO ()
uniqNPoeticalUGNL_ x n vN = uniqNPoetical2GNL n vN (uniquenessPeriods2 x)
{-# INLINE uniqNPoeticalUGNL_ #-}
uniqNPoeticalUGN :: Int -> Int -> Int -> V.Vector ([Int] -> Int) -> String -> IO (V.Vector Uniqueness)
uniqNPoeticalUGN x n k vN = uniqNPoetical2VGN n k vN (uniquenessPeriods2 x)
{-# INLINE uniqNPoeticalUGN #-}
uniqNPoeticalUGNL :: Int -> Int -> V.Vector ([Int] -> Int) -> String -> IO (V.Vector Uniqueness)
uniqNPoeticalUGNL x n vN = uniqNPoetical2VGN n (V.length vN) vN (uniquenessPeriods2 x)
{-# INLINE uniqNPoeticalUGNL #-}
uniqNPoeticalUGN51_ :: Int -> Int -> String -> IO ()
uniqNPoeticalUGN51_ x n = uniqNPoeticalUGN_ x n 1 (V.singleton norm51)
{-# INLINE uniqNPoeticalUGN51_ #-}
uniqNPoeticalUGN51 :: Int -> Int -> String -> IO (V.Vector Uniqueness)
uniqNPoeticalUGN51 x n = uniqNPoeticalUGN x n 1 (V.singleton norm51)
{-# INLINE uniqNPoeticalUGN51 #-}