{-# LANGUAGE BangPatterns, NoImplicitPrelude #-}
{-# OPTIONS_HADDOCK show-extensions #-}

-- |
-- Module      :  Phladiprelio.Rhythmicity.Simple
-- Copyright   :  (c) Oleksandr Zhabenko 2020-2023
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  oleksandr.zhabenko@yahoo.com
--
-- Allows to evaluate (approximately, so better to say, to estimate) the
-- rhythmicity properties for the text (usually, the poetic one).

module Phladiprelio.Rhythmicity.Simple where

import GHC.Base
import GHC.Int
import GHC.Num ((+),(-),(*),abs)
import GHC.Real
import GHC.Float
import GHC.List

-- | Is well defined just for positive values in the list.
maxPosition2 :: (RealFrac a) => [a] -> a
maxPosition2 :: forall a. RealFrac a => [a] -> a
maxPosition2 [a]
xs
 | forall a. [a] -> Bool
null [a]
xs = a
0.0
 | Bool
otherwise = forall {a} {t}. (Ord a, Num a, Num t) => [a] -> Int16 -> t
maxP21 [a]
xs Int16
0
     where maxP21 :: [a] -> Int16 -> t
maxP21 (a
x:ks :: [a]
ks@(a
y:a
t:[a]
ys)) !Int16
acc1 
             | (a
x forall a. Num a => a -> a -> a
- a
y) forall a. Num a => a -> a -> a
* (a
t forall a. Num a => a -> a -> a
- a
y) forall a. Ord a => a -> a -> Bool
<= a
0 = [a] -> Int16 -> t
maxP21 [a]
ks (Int16
acc1::Int16)
             | Bool
otherwise = [a] -> Int16 -> t
maxP21 [a]
ks ((Int16
acc1 forall a. Num a => a -> a -> a
+ Int16
1)::Int16)
           maxP21 [a]
_ !Int16
acc1 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
acc1
          
posMaxIn3
  :: (Ord a) => a
  -> a
  -> a
  -> Int16
posMaxIn3 :: forall a. Ord a => a -> a -> a -> Int16
posMaxIn3 a
x a
y a
z 
 | a
x forall a. Ord a => a -> a -> Bool
< a
y = if a
y forall a. Ord a => a -> a -> Bool
< a
z then Int16
3 else Int16
2
 | a
x forall a. Ord a => a -> a -> Bool
< a
z = Int16
3
 | Bool
otherwise = Int16
1

maxPosition3 :: RealFrac a => [a] -> a
maxPosition3 :: forall a. RealFrac a => [a] -> a
maxPosition3 [a]
xs
  | forall a. [a] -> Bool
null [a]
xs = a
0.0
  | Bool
otherwise = forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall {a}. (Eq a, Num a) => [a] -> (Int16, Int16, Int16) -> Int16
go (forall {a}. Ord a => [a] -> [Int16]
h [a]
xs) ((Int16
0, Int16
0, Int16
0)::(Int16,Int16,Int16)))
      where h :: [a] -> [Int16]
h (a
x:a
y:a
z:[a]
ys) = forall a. Ord a => a -> a -> a -> Int16
posMaxIn3 a
x a
y a
zforall a. a -> [a] -> [a]
:[a] -> [Int16]
h [a]
ys
            h [a]
_ = []
            go :: [a] -> (Int16, Int16, Int16) -> Int16
go (a
x:[a]
zs) (!Int16
acc21,!Int16
acc22,!Int16
acc23) = [a] -> (Int16, Int16, Int16) -> Int16
go [a]
zs (forall {a}.
(Eq a, Num a) =>
a -> (Int16, Int16, Int16) -> (Int16, Int16, Int16)
h1 a
x (Int16
acc21,Int16
acc22,Int16
acc23))
            go [a]
_ (!Int16
acc21,!Int16
acc22,!Int16
acc23)
              | Int16
acc21 forall a. Ord a => a -> a -> Bool
> Int16
acc22 = if Int16
acc21 forall a. Ord a => a -> a -> Bool
> Int16
acc23 then Int16
acc21 else Int16
acc23
              | Int16
acc22 forall a. Ord a => a -> a -> Bool
> Int16
acc23 = Int16
acc22
              | Bool
otherwise = Int16
acc23
            h1 :: a -> (Int16, Int16, Int16) -> (Int16, Int16, Int16)
h1 !a
x (!Int16
t,!Int16
u,!Int16
w)
              | a
x forall a. Eq a => a -> a -> Bool
== a
1 = (Int16
t forall a. Num a => a -> a -> a
+ (Int16
1::Int16), Int16
u, Int16
w)
              | a
x forall a. Eq a => a -> a -> Bool
== a
2 = (Int16
t, Int16
u forall a. Num a => a -> a -> a
+ (Int16
1::Int16), Int16
w)
              | Bool
otherwise = (Int16
t,Int16
u,Int16
w forall a. Num a => a -> a -> a
+ (Int16
1::Int16))

evalRhythmicity23 :: (RealFrac a, Floating a) => [a] -> a
evalRhythmicity23 :: forall a. (RealFrac a, Floating a) => [a] -> a
evalRhythmicity23 [a]
xs = forall a. RealFrac a => [a] -> a
maxPosition2 [a]
xs forall a. Num a => a -> a -> a
+ a
1.31 forall a. Num a => a -> a -> a
* forall a. RealFrac a => [a] -> a
maxPosition3 [a]
xs

evalRhythmicity23K
  :: (RealFrac a, Floating a) => a
  -> a
  -> [a]
  -> a
evalRhythmicity23K :: forall a. (RealFrac a, Floating a) => a -> a -> [a] -> a
evalRhythmicity23K a
k2 a
k3 [a]
xs = a
k2 forall a. Num a => a -> a -> a
* forall a. RealFrac a => [a] -> a
maxPosition2 [a]
xs forall a. Num a => a -> a -> a
+ a
k3 forall a. Num a => a -> a -> a
* a
1.31 forall a. Num a => a -> a -> a
* forall a. RealFrac a => [a] -> a
maxPosition3 [a]
xs