{-# LANGUAGE TypeSynonymInstances, NoImplicitPrelude, Strict, BangPatterns #-}
{-# OPTIONS_HADDOCK show-extensions #-}
-- |
-- Module      :  Phladiprelio.Ukrainian.SyllableWord8
-- Copyright   :  (c) Oleksandr Zhabenko 2021-2024
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  oleksandr.zhabenko@yahoo.com
--
-- This module works with syllable segmentation in Ukrainian. Uses 'Word8' whenever possible.
-- Is inspired by the DobutokO.Sound.DIS5G6G module from @dobutokO2@ package.
-- See: 'https://hackage.haskell.org/package/dobutokO2-0.43.0.0/docs/DobutokO-Sound-DIS5G6G.html'.
-- The initial 'Word8' data are gotten from there.

module Phladiprelio.Ukrainian.SyllableWord8 where

import GHC.Base
import GHC.Num ((+))
import CaseBi.Arr
import Phladiprelio.Ukrainian.Melodics (Sound8)
import GHC.Int
import Data.Foldable (foldl')
import GHC.Word

s0DuratD1 :: Sound8 -> Word8
s0DuratD1 :: Sound8 -> Word8
s0DuratD1 = Word8 -> [(Sound8, Word8)] -> Sound8 -> Word8
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' Word8
5 [(Sound8
1,Word8
15),(Sound8
2,Word8
10),(Sound8
3,Word8
13),(Sound8
4,Word8
12),(Sound8
5,Word8
11),(Sound8
6,Word8
10),(Sound8
7,Word8
1),(Sound8
8,Word8
6),(Sound8
9,Word8
6),(Sound8
10,Word8
7),(Sound8
11,Word8
7),(Sound8
15,Word8
6),(Sound8
16,Word8
6),(Sound8
17,Word8
8),(Sound8
18,Word8
8),(Sound8
19,Word8
7),(Sound8
20,Word8
7),(Sound8
21,Word8
8),(Sound8
22,Word8
8),(Sound8
23,Word8
5),(Sound8
24,Word8
5),(Sound8
25,Word8
6),(Sound8
26,Word8
6),(Sound8
27,Word8
6),(Sound8
28,Word8
7),(Sound8
29,Word8
7),(Sound8
30,Word8
8),(Sound8
31,Word8
8),(Sound8
32,Word8
8),(Sound8
33,Word8
8),(Sound8
34,Word8
5),(Sound8
35,Word8
5),(Sound8
36,Word8
9),(Sound8
37,Word8
9),(Sound8
38,Word8
5),(Sound8
39,Word8
6),(Sound8
40,Word8
6),(Sound8
41,Word8
7),(Sound8
42,Word8
7),(Sound8
43,Word8
6),(Sound8
44,Word8
6),(Sound8
45,Word8
4),(Sound8
46,Word8
4),(Sound8
47,Word8
15),(Sound8
48,Word8
15),(Sound8
49,Word8
8),(Sound8
50,Word8
12),(Sound8
51,Word8
12),(Sound8
52,Word8
8),(Sound8
53,Word8
8),(Sound8
54,Word8
8),(Sound8
66,Word8
10)]
{-# INLINE s0DuratD1 #-}

-- |
s0DuratD2 :: Sound8 -> Word8
s0DuratD2 :: Sound8 -> Word8
s0DuratD2 = Word8 -> [(Sound8, Word8)] -> Sound8 -> Word8
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' Word8
5 [(Sound8
1,Word8
15),(Sound8
2,Word8
15),(Sound8
3,Word8
15),(Sound8
4,Word8
14),(Sound8
5,Word8
11),(Sound8
6,Word8
11),(Sound8
7,Word8
1),(Sound8
8,Word8
4),(Sound8
9,Word8
4),(Sound8
10,Word8
5),(Sound8
11,Word8
5),(Sound8
15,Word8
6),(Sound8
16,Word8
6),(Sound8
17,Word8
4),(Sound8
18,Word8
4),(Sound8
19,Word8
4),(Sound8
20,Word8
4),(Sound8
21,Word8
3),(Sound8
22,Word8
3),(Sound8
23,Word8
5),(Sound8
24,Word8
5),(Sound8
25,Word8
4),(Sound8
26,Word8
4),(Sound8
27,Word8
5),(Sound8
28,Word8
6),(Sound8
29,Word8
6),(Sound8
30,Word8
8),(Sound8
31,Word8
8),(Sound8
32,Word8
3),(Sound8
33,Word8
3),(Sound8
34,Word8
4),(Sound8
35,Word8
4),(Sound8
36,Word8
5),(Sound8
37,Word8
5),(Sound8
38,Word8
3),(Sound8
39,Word8
7),(Sound8
40,Word8
7),(Sound8
41,Word8
7),(Sound8
42,Word8
7),(Sound8
43,Word8
9),(Sound8
44,Word8
9),(Sound8
45,Word8
3),(Sound8
46,Word8
3),(Sound8
47,Word8
5),(Sound8
48,Word8
5),(Sound8
49,Word8
3),(Sound8
50,Word8
3),(Sound8
51,Word8
3),(Sound8
52,Word8
5),(Sound8
53,Word8
5),(Sound8
54,Word8
4),(Sound8
66,Word8
4)] 
{-# INLINE s0DuratD2 #-}

s0DuratD3 :: Sound8 -> Word8
s0DuratD3 :: Sound8 -> Word8
s0DuratD3 = Word8 -> [(Sound8, Word8)] -> Sound8 -> Word8
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' Word8
5 [(Sound8
1,Word8
15),(Sound8
2,Word8
14),(Sound8
3,Word8
15),(Sound8
4,Word8
12),(Sound8
5,Word8
12),(Sound8
6,Word8
12),(Sound8
7,Word8
1),(Sound8
8,Word8
5),(Sound8
9,Word8
5),(Sound8
10,Word8
6),(Sound8
11,Word8
6),(Sound8
15,Word8
8),(Sound8
16,Word8
8),(Sound8
17,Word8
5),(Sound8
18,Word8
5),(Sound8
19,Word8
5),(Sound8
20,Word8
5),(Sound8
21,Word8
6),(Sound8
22,Word8
6),(Sound8
23,Word8
6),(Sound8
24,Word8
6),(Sound8
25,Word8
4),(Sound8
26,Word8
4),(Sound8
27,Word8
7),(Sound8
28,Word8
7),(Sound8
29,Word8
7),(Sound8
30,Word8
9),(Sound8
31,Word8
9),(Sound8
32,Word8
4),(Sound8
33,Word8
4),(Sound8
34,Word8
4),(Sound8
35,Word8
4),(Sound8
36,Word8
5),(Sound8
37,Word8
5),(Sound8
38,Word8
4),(Sound8
39,Word8
7),(Sound8
40,Word8
7),(Sound8
41,Word8
9),(Sound8
42,Word8
9),(Sound8
43,Word8
10),(Sound8
44,Word8
10),(Sound8
45,Word8
4),(Sound8
46,Word8
4),(Sound8
47,Word8
7),(Sound8
48,Word8
7),(Sound8
49,Word8
4),(Sound8
50,Word8
4),(Sound8
51,Word8
4),(Sound8
52,Word8
8),(Sound8
53,Word8
8),(Sound8
54,Word8
5),(Sound8
66,Word8
5)]
{-# INLINE s0DuratD3 #-}

s0DuratD4 :: Sound8 -> Word8
s0DuratD4 :: Sound8 -> Word8
s0DuratD4 = Word8 -> [(Sound8, Word8)] -> Sound8 -> Word8
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' Word8
5 [(Sound8
1,Word8
12),(Sound8
2,Word8
12),(Sound8
3,Word8
12),(Sound8
4,Word8
12),(Sound8
5,Word8
12),(Sound8
6,Word8
12),(Sound8
7,Word8
1),(Sound8
8,Word8
5),(Sound8
9,Word8
5),(Sound8
10,Word8
10),(Sound8
11,Word8
10),(Sound8
15,Word8
5),(Sound8
16,Word8
5),(Sound8
17,Word8
8),(Sound8
18,Word8
8),(Sound8
19,Word8
8),(Sound8
20,Word8
8),(Sound8
21,Word8
13),(Sound8
22,Word8
13),(Sound8
23,Word8
10),(Sound8
24,Word8
10),(Sound8
25,Word8
5),(Sound8
26,Word8
5),(Sound8
27,Word8
4),(Sound8
28,Word8
10),(Sound8
29,Word8
10),(Sound8
30,Word8
15),(Sound8
31,Word8
15),(Sound8
32,Word8
8),(Sound8
33,Word8
8),(Sound8
34,Word8
4),(Sound8
35,Word8
4),(Sound8
36,Word8
6),(Sound8
37,Word8
6),(Sound8
38,Word8
4),(Sound8
39,Word8
12),(Sound8
40,Word8
12),(Sound8
41,Word8
14),(Sound8
42,Word8
14),(Sound8
43,Word8
11),(Sound8
44,Word8
11),(Sound8
45,Word8
6),(Sound8
46,Word8
6),(Sound8
47,Word8
4),(Sound8
48,Word8
4),(Sound8
49,Word8
6),(Sound8
50,Word8
11),(Sound8
51,Word8
11),(Sound8
52,Word8
15),(Sound8
53,Word8
15),(Sound8
54,Word8
7),(Sound8
66,Word8
5)]
{-# INLINE s0DuratD4 #-}

{-
help1 xs = map (\(t, u) -> (t,fromMaybe 15 . hh $ u)) xs 
  where !h = snd . head $ xs
        !lt = snd . last $ xs
        !del = (lt - h)/14.0
        !ys  = take 15 . iterate (+del) $ h
        !zs = zip [1..15] ys
        gg !u = fromMaybe lt . round2GL True (\_ _ -> EQ) ys $ u
        hh !u = fmap fst . find ((== gg u) . snd) $ zs
-}

class (Eq a) => SyllableDurations4 a where
  sDuratsD :: a -> Word8
  sDuratsD2 :: a -> Word8
  sDuratsD3 :: a -> Word8
  sDuratsD4 :: a -> Word8
  syllableDurationsGDc :: (a -> Word8) -> [[[a]]] -> [[Word8]]
  syllableDurationsGDc a -> Word8
g = ([[a]] -> [Word8]) -> [[[a]]] -> [[Word8]]
forall a b. (a -> b) -> [a] -> [b]
map (([a] -> Word8) -> [[a]] -> [Word8]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> Word8) -> [a] -> Word8
forall {t :: * -> *} {b} {t}.
(Foldable t, Num b) =>
(t -> b) -> t t -> b
k a -> Word8
g))
    where k :: (t -> b) -> t t -> b
k t -> b
f = (b -> t -> b) -> b -> t t -> b
forall b a. (b -> a -> b) -> b -> t a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\b
y t
x -> t -> b
f t
x b -> b -> b
forall a. Num a => a -> a -> a
+ b
y) b
0
  {-# INLINE syllableDurationsGDc #-}

instance SyllableDurations4 Sound8 where
  sDuratsD :: Sound8 -> Word8
sDuratsD = Sound8 -> Word8
s0DuratD1
  sDuratsD2 :: Sound8 -> Word8
sDuratsD2 = Sound8 -> Word8
s0DuratD2
  sDuratsD3 :: Sound8 -> Word8
sDuratsD3 = Sound8 -> Word8
s0DuratD3
  sDuratsD4 :: Sound8 -> Word8
sDuratsD4 = Sound8 -> Word8
s0DuratD4

-- | General variant of the 'syllableDurationsD' function.
syllableDurationsGD :: (Sound8 -> Word8) -> [[[Sound8]]] -> [[Word8]]
syllableDurationsGD :: (Sound8 -> Word8) -> [[[Sound8]]] -> [[Word8]]
syllableDurationsGD Sound8 -> Word8
g = (Sound8 -> Word8) -> [[[Sound8]]] -> [[Word8]]
forall a.
SyllableDurations4 a =>
(a -> Word8) -> [[[a]]] -> [[Word8]]
syllableDurationsGDc Sound8 -> Word8
g
{-# INLINE syllableDurationsGD #-}

syllableDurationsD :: [[[Sound8]]] -> [[Word8]]
syllableDurationsD :: [[[Sound8]]] -> [[Word8]]
syllableDurationsD = (Sound8 -> Word8) -> [[[Sound8]]] -> [[Word8]]
forall a.
SyllableDurations4 a =>
(a -> Word8) -> [[[a]]] -> [[Word8]]
syllableDurationsGDc Sound8 -> Word8
s0DuratD1
{-# INLINE syllableDurationsD #-}

syllableDurationsD2 :: [[[Sound8]]] -> [[Word8]]
syllableDurationsD2 :: [[[Sound8]]] -> [[Word8]]
syllableDurationsD2 = (Sound8 -> Word8) -> [[[Sound8]]] -> [[Word8]]
forall a.
SyllableDurations4 a =>
(a -> Word8) -> [[[a]]] -> [[Word8]]
syllableDurationsGDc Sound8 -> Word8
s0DuratD2
{-# INLINE syllableDurationsD2 #-}

syllableDurationsD3 :: [[[Sound8]]] -> [[Word8]]
syllableDurationsD3 :: [[[Sound8]]] -> [[Word8]]
syllableDurationsD3 = (Sound8 -> Word8) -> [[[Sound8]]] -> [[Word8]]
forall a.
SyllableDurations4 a =>
(a -> Word8) -> [[[a]]] -> [[Word8]]
syllableDurationsGDc Sound8 -> Word8
s0DuratD3
{-# INLINE syllableDurationsD3 #-}

syllableDurationsD4 :: [[[Sound8]]] -> [[Word8]]
syllableDurationsD4 :: [[[Sound8]]] -> [[Word8]]
syllableDurationsD4 = (Sound8 -> Word8) -> [[[Sound8]]] -> [[Word8]]
forall a.
SyllableDurations4 a =>
(a -> Word8) -> [[[a]]] -> [[Word8]]
syllableDurationsGDc Sound8 -> Word8
s0DuratD4
{-# INLINE syllableDurationsD4 #-}