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

-- |
-- Module      :  Phladiprelio.Ukrainian.Melodics
-- Copyright   :  (c) OleksandrZhabenko 2021-2023
-- License     :  MIT
-- Maintainer  :  oleksandr.zhabenko@yahoo.com
--
-- Functions provide functionality of a musical instrument synthesizer or for Ukrainian speech synthesis
-- especially for poets, translators and writers. Is rewritten from the module Melodics.ByteString.Ukrainian.Arr
-- for optimization purposes.
-- Phonetic material is taken from the :
--
-- Solomija Buk, Ján Mačutek, Andrij Rovenchak. Some properties of
-- the Ukrainian writing system. [Electronic resource] https://arxiv.org/ftp/arxiv/papers/0802/0802.4198.pdf

module Phladiprelio.Ukrainian.Melodics (
  -- * Basic functions
  Sound8
  , FlowSound
  , convertToProperUkrainianI8WithTuples
  , convertToProperUkrainianI8
  , isUkrainianL
  , linkFileNameI8
  -- * Transformation functions
  , дзT
  , жT
  , дT
  , гT
  , зT
  , цT
  , чT
  , шT
  , фT
  , кT
  , пT
  , сT
  , тT
  , хT
  , сьT
  , нтT
  , стT
  , тьT
  , цьT
) where

import GHC.Base
import GHC.List
import GHC.Num ((-))
import Data.Maybe (fromJust)
import Data.Char
import GHC.Arr
import CaseBi.Arr
import Data.List (uncons)
import GHC.Int
import Phladiprelio.Ukrainian.Common2

-- | Is used to signify the optimization data type of 'Int8'.
type Sound8 = Int8

type FlowSound = [Sound8]

{-| The function that uses the following correspondence between the previous data type UZPP2 and the 'Sound8'.
@
UZ \'A\' D       дз (plain)                 8
UZ \'A\' K       дз (palatalized)           9
UZ \'B\' D       ж  (plain)                 10
UZ \'B\' K       ж  (semi-palatalized)      11
UZ \'C\' S       й                          27
UZ \'D\' N       сь                         54
UZ \'E\' L       ч  (plain)                 39
UZ \'E\' M       ч  (semi-palatalized)      40
UZ \'F\' L       ш  (plain)                 41
UZ \'F\' M       ш  (semi-palatalized)      42
     G                                      55
     H                                      56
     I                                      57
     J                                      58
     K                                      59
     L                                      60
     M                                      61
     N          нт                          62
     O          ст                          63
     P          ть                          64
     Q          дзь                         12
     R          зь                          13
     S          нь                          65
     T          дь                          14
UZ \'a\' W       а                          1
UZ \'b\' D       б  (plain)                 15
UZ \'b\' K       б  (semi-palatalized)      16
UZ \'c\' D       ц  (plain)                 38
UZ \'d\' D       д  (plain)                 17
UZ \'d\' K       д  (palatalized)           18
UZ \'e\' W       е                          2
UZ \'f\' L       ф  (plain)                 43
UZ \'f\' M       ф  (semi-palatalized)      44
UZ \'g\' D       ґ  (plain)                 19
UZ \'g\' K       ґ  (semi-palatalized)      20
UZ \'h\' D       г  (plain)                 21
UZ \'h\' K       г  (semi-palatalized)      22
UZ \'i\' W       і                          6
UZ \'j\' D       дж (plain)                 23
UZ \'j\' K       дж (palatalized)           24
UZ \'k\' L       к  (plain)                 45
UZ \'k\' M       к  (semi-palatalized)      46
UZ \'l\' S       л  (plain)                 28
UZ \'l\' O       л  (palatalized)           29
UZ \'m\' S       м  (plain)                 30
UZ \'m\' O       м  (semi-palatalized)      31
UZ \'n\' S       н  (plain)                 32
UZ \'n\' O       н  (palatalized)           33
UZ \'o\' W       о                          3
UZ \'p\' L       п  (plain)                 47
UZ \'p\' M       п  (semi-palatalized)      48
UZ \'q\' E       ь                          7
UZ \'r\' S       р  (plain)                 34
UZ \'r\' O       р  (palatalized)           35
UZ \'s\' L       с  (plain)                 49
UZ \'t\' L       т  (plain)                 50
UZ \'t\' M       т  (palatalized)           51
UZ \'u\' W       у                          4
UZ \'v\' S       в  (plain)                 36
UZ \'v\' O       в  (semi-palatalized)      37
UZ \'w\' N       ць                         66
UZ \'x\' L       х  (plain)                 52
UZ \'x\' M       х  (semi-palatalized)      53
UZ \'y\' W       и                          5
UZ \'z\' D       з  (plain)                 25
UZ \'z\' K       з  (palatalized)           26
@

Starting from the version 0.6.0.0:

-2 -> 102
-1 -> 101
0 -> 100
-}
convertToProperUkrainianI8 :: String -> FlowSound
convertToProperUkrainianI8 :: String -> [Sound8]
convertToProperUkrainianI8 =
      let !tup1 :: Array Int (Sound8, Bool)
tup1 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
13) [(Sound8
10,Bool
True),(Sound8
17,Bool
True),(Sound8
21,Bool
True),(Sound8
25,Bool
True),(Sound8
32,Bool
True),(Sound8
38,Bool
True),(Sound8
39,Bool
True),
              (Sound8
41,Bool
True),(Sound8
43,Bool
True),(Sound8
45,Bool
True),(Sound8
47,Bool
True),(Sound8
49,Bool
True),(Sound8
50,Bool
True),(Sound8
52,Bool
True)]
          !tup2 :: Array Int (Sound8, Bool)
tup2 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
19) [(Sound8
10,Bool
True),(Sound8
15,Bool
True),(Sound8
17,Bool
True),(Sound8
19,Bool
True),(Sound8
21,Bool
True),(Sound8
25,Bool
True),(Sound8
28,Bool
True),
              (Sound8
30,Bool
True),(Sound8
32,Bool
True),(Sound8
34,Bool
True),(Sound8
36,Bool
True),(Sound8
38,Bool
True),(Sound8
39,Bool
True),(Sound8
41,Bool
True),(Sound8
43,Bool
True),(Sound8
45,Bool
True),(Sound8
47,Bool
True),
                (Sound8
49,Bool
True),(Sound8
50,Bool
True),(Sound8
52,Bool
True)]
          !tup3 :: Array Int (Sound8, Bool)
tup3 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
13) [(Sound8
10,Bool
False),(Sound8
17,Bool
False),(Sound8
21,Bool
False),(Sound8
25,Bool
False),(Sound8
32,Bool
False),(Sound8
38,Bool
False),(Sound8
39,Bool
False),
                  (Sound8
41,Bool
False),(Sound8
43,Bool
False),(Sound8
45,Bool
False),(Sound8
47,Bool
False),(Sound8
49,Bool
False),(Sound8
50,Bool
False),(Sound8
52,Bool
False)]
          !tup4 :: Array Int (Sound8, Bool)
tup4 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
5) [(Sound8
17,Bool
True),(Sound8
32,Bool
True),(Sound8
38,Bool
True),(Sound8
49,Bool
True),(Sound8
50,Bool
True),(Sound8
52,Bool
True)]
          !tup5 :: Array Int ([Sound8], Bool)
tup5 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
8) [([Sound8
17,Sound8
10],Bool
True),([Sound8
17,Sound8
25],Bool
True),([Sound8
32,Sound8
50],Bool
True),([Sound8
38,Sound8
7],Bool
True),([Sound8
49,Sound8
7],Bool
True),
              ([Sound8
49,Sound8
50],Bool
True),([Sound8
50,Sound8
7],Bool
True),([Sound8
50,Sound8
49],Bool
True),([Sound8
52,Sound8
21],Bool
True)]
          !tup6 :: Array Int ([Sound8], Sound8)
tup6 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
8) [([Sound8
17,Sound8
10],Sound8
23),([Sound8
17,Sound8
25],Sound8
8),([Sound8
32,Sound8
50],Sound8
62),([Sound8
38,Sound8
7],Sound8
66),([Sound8
49,Sound8
7],Sound8
54), ([Sound8
49,Sound8
50],Sound8
63),
              ([Sound8
50,Sound8
7],Sound8
64),([Sound8
50,Sound8
49],Sound8
38),([Sound8
52,Sound8
21],Sound8
21)]
          !tup8 :: Array Int (Sound8, Bool)
tup8 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
7) [(Sound8
8,Bool
True),(Sound8
10,Bool
True),(Sound8
15,Bool
True),(Sound8
17,Bool
True),(Sound8
19,Bool
True),(Sound8
21,Bool
True),(Sound8
23,Bool
True),(Sound8
25, Bool
True)]
          !tup9 :: Array Int ([Sound8], Bool)
tup9 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
10) [([Sound8
15,Sound8
7],Bool
True),([Sound8
17,Sound8
7],Bool
True),([Sound8
28,Sound8
7],Bool
True),([Sound8
30,Sound8
7],Bool
True),([Sound8
32,Sound8
7],Bool
True),([Sound8
36,Sound8
7],Bool
True),
              ([Sound8
38,Sound8
7],Bool
True),([Sound8
43,Sound8
7],Bool
True),([Sound8
47,Sound8
7],Bool
True),([Sound8
49,Sound8
7],Bool
True),([Sound8
50,Sound8
7],Bool
True)]
          !tup10 :: Array Int ([Sound8], Bool)
tup10 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
4) [([Sound8
12],Bool
True),([Sound8
13],Bool
True),([Sound8
14],Bool
True),([Sound8
64],Bool
True),([Sound8
65],Bool
True)]
          !tup11 :: Array Int ([Sound8], Bool)
tup11 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
7) [([Sound8
8,Sound8
7],Bool
True),([Sound8
17,Sound8
7],Bool
True),([Sound8
25,Sound8
7],Bool
True),([Sound8
28,Sound8
7],Bool
True),([Sound8
32,Sound8
7],Bool
True),([Sound8
38,Sound8
7],Bool
True),
              ([Sound8
49,Sound8
7],Bool
True),([Sound8
50,Sound8
7],Bool
True)]
          tup7 :: Array Int (Sound8, [Sound8] -> Sound8)
tup7 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
18) [(Sound8
8, Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Sound8
дзT Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10),(Sound8
10, [Sound8] -> Sound8
жT),(Sound8
17, [Sound8] -> Sound8
дT),(Sound8
21, [Sound8] -> Sound8
гT),(Sound8
25, Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Sound8
зT Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10),(Sound8
38, Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> Sound8
цT Array Int (Sound8, Bool)
tup8 Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10),
              (Sound8
39, [Sound8] -> Sound8
чT),(Sound8
41, [Sound8] -> Sound8
шT),(Sound8
43, [Sound8] -> Sound8
фT), (Sound8
45, [Sound8] -> Sound8
кT),(Sound8
47, [Sound8] -> Sound8
пT),(Sound8
49, Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> Sound8
сT Array Int (Sound8, Bool)
tup8 Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10),(Sound8
50, Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> Sound8
тT Array Int (Sound8, Bool)
tup8 Array Int ([Sound8], Bool)
tup11 Array Int ([Sound8], Bool)
tup10),
                (Sound8
52, [Sound8] -> Sound8
хT),(Sound8
54, [Sound8] -> Sound8
сьT),(Sound8
62, [Sound8] -> Sound8
нтT),(Sound8
63, [Sound8] -> Sound8
стT),(Sound8
64, [Sound8] -> Sound8
тьT),(Sound8
66, [Sound8] -> Sound8
цьT)]
          !tup12 :: Array Int (Sound8, [Sound8])
tup12 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
6) [(Sound8
12,[Sound8
8,Sound8
7]),(Sound8
13,[Sound8
25,Sound8
7]),(Sound8
14,[Sound8
17,Sound8
7]),(Sound8
62,[Sound8
32,Sound8
50]),(Sound8
63,[Sound8
49,Sound8
50]),(Sound8
64,[Sound8
50,Sound8
7]), (Sound8
65,[Sound8
32,Sound8
7])]
          !tup13 :: Array Int (Char, Sound8)
tup13 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
36) [(Char
'\'',Sound8
102),(Char
'-',Sound8
101),(Char
'\700',Sound8
60),(Char
'\1072',Sound8
1),(Char
'\1073',Sound8
15),(Char
'\1074',Sound8
36),(Char
'\1075',Sound8
21),
              (Char
'\1076',Sound8
17),(Char
'\1077',Sound8
2),(Char
'\1078',Sound8
10),(Char
'\1079',Sound8
25),(Char
'\1080',Sound8
5),(Char
'\1081',Sound8
27),(Char
'\1082',Sound8
45),(Char
'\1083',Sound8
28),
                (Char
'\1084',Sound8
30),(Char
'\1085',Sound8
32),(Char
'\1086',Sound8
3),(Char
'\1087',Sound8
47),(Char
'\1088',Sound8
34),(Char
'\1089',Sound8
49),(Char
'\1090',Sound8
50),(Char
'\1091',Sound8
4),
                  (Char
'\1092',Sound8
43),(Char
'\1093',Sound8
52),(Char
'\1094',Sound8
38),(Char
'\1095',Sound8
39),(Char
'\1096',Sound8
41),(Char
'\1097',Sound8
55),(Char
'\1100',Sound8
7),(Char
'\1102',Sound8
56),
                    (Char
'\1103',Sound8
57),(Char
'\1108',Sound8
58),(Char
'\1110',Sound8
6),(Char
'\1111',Sound8
59),(Char
'\1169',Sound8
19),(Char
'\8217',Sound8
61)]
          !tup14 :: Array Int (Sound8, [Sound8])
tup14 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
8) [(Sound8
55,[Sound8
41,Sound8
39]),(Sound8
56,[Sound8
27,Sound8
4]),(Sound8
57,[Sound8
27,Sound8
1]),(Sound8
58,[Sound8
27,Sound8
2]),(Sound8
59,[Sound8
27,Sound8
6]),
              (Sound8
60,[Sound8
101]),(Sound8
61,[Sound8
101]),(Sound8
101,[Sound8
101]),(Sound8
102,[Sound8
101])]
          !tup15 :: Array Int (Char, Bool)
tup15 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
15) [(Char
'\'',Bool
True),(Char
'-',Bool
True),(Char
'\700',Bool
True),(Char
'\1028',Bool
True),(Char
'\1030',Bool
True),(Char
'\1031',Bool
True),
              (Char
'\1068',Bool
True),(Char
'\1100',Bool
True),(Char
'\1102',Bool
True),(Char
'\1103',Bool
True),(Char
'\1108',Bool
True),(Char
'\1110',Bool
True),(Char
'\1111',Bool
True),
                (Char
'\1168',Bool
True),(Char
'\1169',Bool
True),(Char
'\8217',Bool
True)]
          !tup16 :: Array Int (Char, Bool)
tup16 = forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
20) [(Char
'\1073',Bool
True),(Char
'\1074',Bool
True),(Char
'\1075',Bool
True),(Char
'\1076',Bool
True),(Char
'\1078',Bool
True),
              (Char
'\1079',Bool
True),(Char
'\1082',Bool
True),(Char
'\1083',Bool
True),(Char
'\1084',Bool
True),(Char
'\1085',Bool
True),(Char
'\1087',Bool
True),(Char
'\1088',Bool
True),
                (Char
'\1089',Bool
True),(Char
'\1090',Bool
True),(Char
'\1092',Bool
True),(Char
'\1093',Bool
True),(Char
'\1094',Bool
True),(Char
'\1095',Bool
True),(Char
'\1096',Bool
True),
                  (Char
'\1097',Bool
True),(Char
'\1169',Bool
True)] in
            [Sound8] -> [Sound8]
correctB forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Sound8, [Sound8]) -> [Sound8] -> [Sound8]
correctA Array Int (Sound8, [Sound8])
tup12 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Sound8, [Sound8] -> Sound8) -> [Sound8] -> [Sound8]
applyChanges Array Int (Sound8, [Sound8] -> Sound8)
tup7 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int ([Sound8], Sound8) -> [[Sound8]] -> [Sound8]
bsToCharUkr Array Int ([Sound8], Sound8)
tup6 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
createTuplesByAnalysis Array Int (Sound8, Bool)
tup1 Array Int (Sound8, Bool)
tup2 Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
              Array Int (Sound8, [Sound8]) -> [Sound8] -> [Sound8]
secondConv Array Int (Sound8, [Sound8])
tup14 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Char, Sound8) -> String -> [Sound8]
filterUkr Array Int (Char, Sound8)
tup13 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Char, Bool) -> String -> String
changeIotated Array Int (Char, Bool)
tup16 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
                forall a. (a -> Bool) -> [a] -> [a]
filter (\Char
x -> Array Int (Char, Bool) -> Char -> Bool
isUkrainianLTup Array Int (Char, Bool)
tup15 Char
x Bool -> Bool -> Bool
|| Char -> Bool
isSpace Char
x Bool -> Bool -> Bool
|| Char -> Bool
isControl Char
x Bool -> Bool -> Bool
|| Char -> Bool
isPunctuation Char
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower

{-| A full variant of the 'convertToProperUkrainianI8' function with all the elements for the 'getBFst'' function being
provided as 'Array' 'Int' (data tuple). Can be useful to reduce number of calculations in the complex usage scenarios.
-}
convertToProperUkrainianI8WithTuples
  :: Array Int (Int8, Bool)
     -> Array Int (Int8, Bool)
     -> Array Int (Int8, Bool)
     -> Array Int (Int8, Bool)
     -> Array Int ([Int8], Bool)
     -> Array Int ([Int8], Int8)
     -> Array Int (Int8, FlowSound -> Sound8)
     -> Array Int (Int8, Bool)
     -> Array Int ([Int8], Bool)
     -> Array Int ([Int8], Bool)
     -> Array Int ([Int8], Bool)
     -> Array Int (Int8, [Int8])
     -> Array Int (Char,Int8)
     -> Array Int (Int8,[Int8])
     -> Array Int (Char, Bool)
     -> Array Int (Char, Bool)
     -> [Char]
     -> FlowSound
convertToProperUkrainianI8WithTuples :: Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Sound8)
-> Array Int (Sound8, [Sound8] -> Sound8)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool)
-> Array Int (Sound8, [Sound8])
-> Array Int (Char, Sound8)
-> Array Int (Sound8, [Sound8])
-> Array Int (Char, Bool)
-> Array Int (Char, Bool)
-> String
-> [Sound8]
convertToProperUkrainianI8WithTuples !Array Int (Sound8, Bool)
tup1 !Array Int (Sound8, Bool)
tup2 !Array Int (Sound8, Bool)
tup3 !Array Int (Sound8, Bool)
tup4 !Array Int ([Sound8], Bool)
tup5 !Array Int ([Sound8], Sound8)
tup6 Array Int (Sound8, [Sound8] -> Sound8)
tup7 !Array Int (Sound8, Bool)
tup8 !Array Int ([Sound8], Bool)
tup9 !Array Int ([Sound8], Bool)
tup10 !Array Int ([Sound8], Bool)
tup11 !Array Int (Sound8, [Sound8])
tup12 !Array Int (Char, Sound8)
tup13 !Array Int (Sound8, [Sound8])
tup14 !Array Int (Char, Bool)
tup15 !Array Int (Char, Bool)
tup16 =
  [Sound8] -> [Sound8]
correctB forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Sound8, [Sound8]) -> [Sound8] -> [Sound8]
correctA Array Int (Sound8, [Sound8])
tup12 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Sound8, [Sound8] -> Sound8) -> [Sound8] -> [Sound8]
applyChanges Array Int (Sound8, [Sound8] -> Sound8)
tup7 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int ([Sound8], Sound8) -> [[Sound8]] -> [Sound8]
bsToCharUkr Array Int ([Sound8], Sound8)
tup6 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
createTuplesByAnalysis Array Int (Sound8, Bool)
tup1 Array Int (Sound8, Bool)
tup2 Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Array Int (Sound8, [Sound8]) -> [Sound8] -> [Sound8]
secondConv Array Int (Sound8, [Sound8])
tup14 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Char, Sound8) -> String -> [Sound8]
filterUkr Array Int (Char, Sound8)
tup13 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Char, Bool) -> String -> String
changeIotated Array Int (Char, Bool)
tup16 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
      forall a. (a -> Bool) -> [a] -> [a]
filter (\Char
x -> Array Int (Char, Bool) -> Char -> Bool
isUkrainianLTup Array Int (Char, Bool)
tup15 Char
x Bool -> Bool -> Bool
|| Char -> Bool
isSpace Char
x Bool -> Bool -> Bool
|| Char -> Bool
isControl Char
x Bool -> Bool -> Bool
|| Char -> Bool
isPunctuation Char
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower

changeIotated :: Array Int (Char,Bool) -> String -> String
changeIotated :: Array Int (Char, Bool) -> String -> String
changeIotated !Array Int (Char, Bool)
tup16 (Char
x:Char
y:String
zs)
  | (Char
y forall a. Eq a => a -> [a] -> Bool
`elem` (String
"\1102\1103\1108\1110"::String)) Bool -> Bool -> Bool
&& Array Int (Char, Bool) -> Char -> Bool
isConsNotJTup Array Int (Char, Bool)
tup16 Char
x = Char
xforall a. a -> [a] -> [a]
:Char
'\1100'forall a. a -> [a] -> [a]
:(case Char
y of { Char
'\1102' -> Char
'\1091' ; Char
'\1103' -> Char
'\1072' ; Char
'\1108' -> Char
'\1077' ; ~Char
r -> Char
'\1110' })forall a. a -> [a] -> [a]
:Array Int (Char, Bool) -> String -> String
changeIotated Array Int (Char, Bool)
tup16 String
zs
  | Char
x forall a. Eq a => a -> a -> Bool
== Char
'\'' Bool -> Bool -> Bool
|| Char
x forall a. Eq a => a -> a -> Bool
== Char
'\x2019' Bool -> Bool -> Bool
|| Char
x forall a. Eq a => a -> a -> Bool
== Char
'\x02BC' Bool -> Bool -> Bool
|| Char
x forall a. Eq a => a -> a -> Bool
== Char
'-' = if (Char
y forall a. Eq a => a -> [a] -> Bool
`elem` (String
"\1102\1103\1108\1110"::String)) then Char
'\1081'forall a. a -> [a] -> [a]
:(case Char
y of { Char
'\1102' -> Char
'\1091' ; Char
'\1103' -> Char
'\1072' ; Char
'\1108' -> Char
'\1077' ; ~Char
r -> Char
'\1110' })forall a. a -> [a] -> [a]
:Array Int (Char, Bool) -> String -> String
changeIotated Array Int (Char, Bool)
tup16 String
zs else Array Int (Char, Bool) -> String -> String
changeIotated Array Int (Char, Bool)
tup16 (Char
yforall a. a -> [a] -> [a]
:String
zs)
  | Bool
otherwise = Char
xforall a. a -> [a] -> [a]
:Array Int (Char, Bool) -> String -> String
changeIotated Array Int (Char, Bool)
tup16 (Char
yforall a. a -> [a] -> [a]
:String
zs)
changeIotated Array Int (Char, Bool)
_ String
xs = String
xs

filterUkr :: Array Int (Char,Int8) -> String -> FlowSound
filterUkr :: Array Int (Char, Sound8) -> String -> [Sound8]
filterUkr Array Int (Char, Sound8)
tup13 = let !tup :: (Sound8, Array Int (Char, Sound8))
tup = (Sound8
100, Array Int (Char, Sound8)
tup13) in forall a b. (a -> b) -> [a] -> [b]
map (forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Sound8, Array Int (Char, Sound8))
tup)

secondConv :: Array Int (Int8,[Int8]) -> FlowSound -> FlowSound
secondConv :: Array Int (Sound8, [Sound8]) -> [Sound8] -> [Sound8]
secondConv Array Int (Sound8, [Sound8])
tup14 = forall a b. (a -> [b]) -> [a] -> [b]
concatMap (\Sound8
y -> forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' ([Sound8
y], Array Int (Sound8, [Sound8])
tup14) Sound8
y)

createTuplesByAnalysis :: Array Int (Int8,Bool) -> Array Int (Int8,Bool) -> Array Int (Int8,Bool) -> Array Int (Int8,Bool) -> Array Int ([Int8],Bool) -> FlowSound -> [FlowSound]
createTuplesByAnalysis :: Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
createTuplesByAnalysis Array Int (Sound8, Bool)
tup1 Array Int (Sound8, Bool)
tup2 Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 x :: [Sound8]
x@(Sound8
h:[Sound8]
ta)
  | forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int (Sound8, Bool)
tup1) Sound8
h = Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
initialA Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 [Sound8]
x
  | Bool -> Bool
not (forall a. [a] -> Bool
null [Sound8]
ta) Bool -> Bool -> Bool
&& (forall a. [a] -> a
head [Sound8]
ta forall a. Eq a => a -> a -> Bool
== Sound8
27 Bool -> Bool -> Bool
&& forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int (Sound8, Bool)
tup2) Sound8
h) = [Sound8
h]forall a. a -> [a] -> [a]
:[Sound8
7]forall a. a -> [a] -> [a]
:Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
createTuplesByAnalysis Array Int (Sound8, Bool)
tup1 Array Int (Sound8, Bool)
tup2 Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 (forall a. Int -> [a] -> [a]
drop Int
1 [Sound8]
ta)
  | Bool
otherwise = [Sound8
h]forall a. a -> [a] -> [a]
:Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
createTuplesByAnalysis Array Int (Sound8, Bool)
tup1 Array Int (Sound8, Bool)
tup2 Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 [Sound8]
ta
createTuplesByAnalysis Array Int (Sound8, Bool)
_ Array Int (Sound8, Bool)
_ Array Int (Sound8, Bool)
_ Array Int (Sound8, Bool)
_ Array Int ([Sound8], Bool)
_ [Sound8]
_ = []

initialA :: Array Int (Int8,Bool) -> Array Int (Int8,Bool) -> Array Int ([Int8],Bool) -> FlowSound -> [FlowSound]
initialA :: Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
initialA Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 t1 :: [Sound8]
t1@(Sound8
t:[Sound8]
ts)
  | Sound8
t forall a. Ord a => a -> a -> Bool
< Sound8
1 Bool -> Bool -> Bool
|| Sound8
t forall a. Ord a => a -> a -> Bool
> Sound8
99 = [Sound8
100]forall a. a -> [a] -> [a]
:Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
initialA Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 [Sound8]
ts
  | forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
True, Array Int (Sound8, Bool)
tup3) Sound8
t = [Sound8
t]forall a. a -> [a] -> [a]
:Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
initialA Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 [Sound8]
ts
  | forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int (Sound8, Bool)
tup4) Sound8
t =
     let ([Sound8]
us,[Sound8]
vs) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
2 [Sound8]
t1 in
       if forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int ([Sound8], Bool)
tup5) [Sound8]
us
        then [Sound8]
usforall a. a -> [a] -> [a]
:Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
initialA Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 [Sound8]
vs
        else [Sound8
t]forall a. a -> [a] -> [a]
:Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
initialA Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 [Sound8]
ts
  | Bool
otherwise = [Sound8
t]forall a. a -> [a] -> [a]
:Array Int (Sound8, Bool)
-> Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> [[Sound8]]
initialA Array Int (Sound8, Bool)
tup3 Array Int (Sound8, Bool)
tup4 Array Int ([Sound8], Bool)
tup5 [Sound8]
ts
initialA Array Int (Sound8, Bool)
_ Array Int (Sound8, Bool)
_ Array Int ([Sound8], Bool)
_ [Sound8]
_ = []


bsToCharUkr :: Array Int ([Int8],Int8) -> [FlowSound] -> FlowSound
bsToCharUkr :: Array Int ([Sound8], Sound8) -> [[Sound8]] -> [Sound8]
bsToCharUkr Array Int ([Sound8], Sound8)
tup6 zs :: [[Sound8]]
zs@([Sound8]
_:[[Sound8]]
_) = forall a b. (a -> b) -> [a] -> [b]
map (forall {b}. (Ord b, Num b) => Array Int ([b], b) -> [b] -> b
g Array Int ([Sound8], Sound8)
tup6) [[Sound8]]
zs
     where g :: Array Int ([b], b) -> [b] -> b
g Array Int ([b], b)
tup6 ts :: [b]
ts@(b
t:[b]
_) = forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (b
t, Array Int ([b], b)
tup6) [b]
ts
           g Array Int ([b], b)
_ [b]
_ = b
101
bsToCharUkr Array Int ([Sound8], Sound8)
_ [[Sound8]]
_ = []

applyChanges
  :: Array Int (Int8,FlowSound -> Sound8)
  -> FlowSound
  -> FlowSound
applyChanges :: Array Int (Sound8, [Sound8] -> Sound8) -> [Sound8] -> [Sound8]
applyChanges Array Int (Sound8, [Sound8] -> Sound8)
tup7 [Sound8]
ys = forall a b. (a -> b -> b) -> b -> [a] -> b
foldr Sound8 -> [Sound8] -> [Sound8]
f forall a. [a]
v [Sound8]
ys
  where v :: [a]
v = []
        f :: Sound8 -> [Sound8] -> [Sound8]
f Sound8
x xs :: [Sound8]
xs@(Sound8
_:[Sound8]
_) = forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (\[Sound8]
_ -> Sound8
x, Array Int (Sound8, [Sound8] -> Sound8)
tup7) Sound8
x [Sound8]
xsforall a. a -> [a] -> [a]
:[Sound8]
xs
        f Sound8
x [Sound8]
_ = [Sound8
x]

isVoicedObstruent :: FlowSound -> Bool
isVoicedObstruent :: [Sound8] -> Bool
isVoicedObstruent (Sound8
x:[Sound8]
_) = Sound8
x forall a. Ord a => a -> a -> Bool
> Sound8
7 Bool -> Bool -> Bool
&& Sound8
x forall a. Ord a => a -> a -> Bool
< Sound8
27
isVoicedObstruent [Sound8]
_ = Bool
False

isVoicedObstruentH :: Array Int (Int8,Bool) -> FlowSound -> Bool
isVoicedObstruentH :: Array Int (Sound8, Bool) -> [Sound8] -> Bool
isVoicedObstruentH Array Int (Sound8, Bool)
tup8 (Sound8
x:[Sound8]
_) = forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int (Sound8, Bool)
tup8) Sound8
x
isVoicedObstruentH Array Int (Sound8, Bool)
_ [Sound8]
_ = Bool
False

isVoicedObstruentS :: FlowSound -> Bool
isVoicedObstruentS :: [Sound8] -> Bool
isVoicedObstruentS (Sound8
x:[Sound8]
_) = Sound8
x forall a. Ord a => a -> a -> Bool
> Sound8
11 Bool -> Bool -> Bool
&& Sound8
x forall a. Ord a => a -> a -> Bool
< Sound8
15
isVoicedObstruentS [Sound8]
_ = Bool
False

isSoftDOrL :: Array Int ([Int8],Bool) -> Array Int ([Int8],Bool) -> FlowSound -> Bool
isSoftDOrL :: Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Bool
isSoftDOrL Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10 [Sound8]
xs = forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int ([Sound8], Bool)
tup9) (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
xs) Bool -> Bool -> Bool
|| forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int ([Sound8], Bool)
tup10) (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
xs)

isSoftDen :: Array Int ([Int8],Bool) -> Array Int ([Int8],Bool) -> FlowSound -> Bool
isSoftDen :: Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Bool
isSoftDen Array Int ([Sound8], Bool)
tup11 Array Int ([Sound8], Bool)
tup10 [Sound8]
xs = forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int ([Sound8], Bool)
tup11) (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
xs) Bool -> Bool -> Bool
|| forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int ([Sound8], Bool)
tup10) (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
xs)

гT :: FlowSound -> Sound8
гT :: [Sound8] -> Sound8
гT (Sound8
t:[Sound8]
_) | Sound8
t forall a. Eq a => a -> a -> Bool
== Sound8
45 Bool -> Bool -> Bool
|| Sound8
t forall a. Eq a => a -> a -> Bool
== Sound8
50 = Sound8
52 -- г х
         | Bool
otherwise = Sound8
21
гT [Sound8]
_ = Sound8
21

дT :: FlowSound -> Sound8
дT :: [Sound8] -> Sound8
дT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
10],[Sound8
39],[Sound8
41]] = Sound8
23 --  д дж
            | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
49,Sound8
7],[Sound8
38,Sound8
7]] = Sound8
12 --  д дзь
            | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
54],[Sound8
66]] = Sound8
12 --  д дзь
            | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
25],[Sound8
49],[Sound8
38]] = Sound8
8 --   д дз
            | Bool
otherwise = Sound8
17
дT [Sound8]
_ = Sound8
17

дзT :: Array Int ([Int8],Bool) -> Array Int ([Int8],Bool) -> FlowSound -> Sound8
дзT :: Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Sound8
дзT Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10 t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Bool
isSoftDOrL Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10 [Sound8]
t1 = Sound8
12 -- дз дзь
                        | Bool
otherwise = Sound8
8
дзT Array Int ([Sound8], Bool)
_ Array Int ([Sound8], Bool)
_ [Sound8]
_ = Sound8
8

жT :: FlowSound -> Sound8
жT :: [Sound8] -> Sound8
жT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | Int -> [Sound8] -> [Sound8]
takeFromFT Int
2 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
49,Sound8
7],[Sound8
38,Sound8
7]] = Sound8
13  -- ж зь
            | Int -> [Sound8] -> [Sound8]
takeFromFT Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
54],[Sound8
66]] = Sound8
13
            | Bool
otherwise = Sound8
10
жT [Sound8]
_ = Sound8
10

зT :: Array Int ([Int8],Bool) -> Array Int ([Int8],Bool) -> FlowSound -> Sound8
зT :: Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Sound8
зT Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10 t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
10],[Sound8
39],[Sound8
41]] Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
17,Sound8
10] Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
23] = Sound8
10  -- з ж
                       | Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Bool
isSoftDOrL Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10 [Sound8]
t1 = Sound8
13        -- з зь
                       | Int -> [Sound8] -> [Sound8]
takeFromFT Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
39],[Sound8
41]] = Sound8
41 --  з ш
                       | Int -> [Sound8] -> [Sound8]
takeFromFT Int
1 [Sound8]
t1  forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
49],[Sound8
38]] Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
45],[Sound8
47],[Sound8
50],[Sound8
43],[Sound8
52]] = Sound8
49 --  з с
                       | Bool
otherwise = Sound8
25
зT Array Int ([Sound8], Bool)
_ Array Int ([Sound8], Bool)
_ [Sound8]
_ = Sound8
25

кT :: FlowSound -> Sound8
кT :: [Sound8] -> Sound8
кT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | [Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
19
            | Bool
otherwise = Sound8
45
кT [Sound8]
_ = Sound8
45

нтT :: FlowSound -> Sound8
нтT :: [Sound8] -> Sound8
нтT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | Int -> [Sound8] -> [Sound8]
takeFromFT Int
2 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
49,Sound8
50] Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT Int
1 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
63] = Sound8
32
             | Int -> [Sound8] -> [Sound8]
takeFromFT Int
3 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
49,Sound8
7,Sound8
45] Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT Int
2 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
54,Sound8
45] = Sound8
65
             | Bool
otherwise = Sound8
62
нтT [Sound8]
_ = Sound8
62

пT :: FlowSound -> Sound8
пT :: [Sound8] -> Sound8
пT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | [Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
15
            | Bool
otherwise = Sound8
47
пT [Sound8]
_ = Sound8
47

сT :: Array Int (Int8,Bool) -> Array Int ([Int8],Bool) -> Array Int ([Int8],Bool) -> FlowSound -> Sound8
сT :: Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> Sound8
сT Array Int (Sound8, Bool)
tup8 Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10 t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_)
  | ((Array Int (Sound8, Bool) -> [Sound8] -> Bool
isVoicedObstruentH Array Int (Sound8, Bool)
tup8 forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1) Bool -> Bool -> Bool
&& forall a. Int -> [a] -> [a]
drop Int
1 (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1) forall a. Eq a => a -> a -> Bool
== [Sound8
7]) Bool -> Bool -> Bool
||
      [Sound8] -> Bool
isVoicedObstruentS (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1) = Sound8
13
  | Array Int (Sound8, Bool) -> [Sound8] -> Bool
isVoicedObstruentH Array Int (Sound8, Bool)
tup8 forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
25
  | Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Bool
isSoftDOrL Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10 [Sound8]
t1 = Sound8
54
  | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
41] = Sound8
41
  | Bool
otherwise = Sound8
49
сT Array Int (Sound8, Bool)
_ Array Int ([Sound8], Bool)
_ Array Int ([Sound8], Bool)
_ [Sound8]
_ = Sound8
49

стT :: FlowSound -> Sound8
стT :: [Sound8] -> Sound8
стT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_)
  | [Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1  = Sound8
25
  | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
3 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
49,Sound8
7,Sound8
45] Bool -> Bool -> Bool
|| (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
54,Sound8
45],[Sound8
38,Sound8
7]]) Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
66] = Sound8
54
  | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
49],[Sound8
32]] = Sound8
49
  | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
39] = Sound8
41
  | Bool
otherwise = Sound8
63
стT [Sound8]
_ = Sound8
63

сьT :: FlowSound -> Sound8
сьT :: [Sound8] -> Sound8
сьT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | [Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
13
             | Bool
otherwise = Sound8
54
сьT [Sound8]
_ = Sound8
54

тT :: Array Int (Int8,Bool) -> Array Int ([Int8],Bool) -> Array Int ([Int8],Bool) -> FlowSound -> Sound8
тT :: Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> Sound8
тT Array Int (Sound8, Bool)
tup8 Array Int ([Sound8], Bool)
tup11 Array Int ([Sound8], Bool)
tup10 t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_)
  | ((Array Int (Sound8, Bool) -> [Sound8] -> Bool
isVoicedObstruentH Array Int (Sound8, Bool)
tup8 forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1) Bool -> Bool -> Bool
&& forall a. Int -> [a] -> [a]
drop Int
1 (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1) forall a. Eq a => a -> a -> Bool
== [Sound8
7]) Bool -> Bool -> Bool
||
       [Sound8] -> Bool
isVoicedObstruentS (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1) = Sound8
14
  | Array Int (Sound8, Bool) -> [Sound8] -> Bool
isVoicedObstruentH Array Int (Sound8, Bool)
tup8 forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
17
  | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
38,Sound8
7] Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
66]  = Sound8
66
  | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
38] = Sound8
38
  | Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Bool
isSoftDen Array Int ([Sound8], Bool)
tup11 Array Int ([Sound8], Bool)
tup10 [Sound8]
t1 = Sound8
64
  | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
39],[Sound8
41]] = Sound8
39
  | Bool
otherwise = Sound8
50
тT Array Int (Sound8, Bool)
_ Array Int ([Sound8], Bool)
_ Array Int ([Sound8], Bool)
_ [Sound8]
_ = Sound8
50

тьT :: FlowSound -> Sound8
тьT :: [Sound8] -> Sound8
тьT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | [Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
14
             | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
3 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
49,Sound8
7,Sound8
1] Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1 forall a. Eq a => a -> a -> Bool
== [Sound8
54,Sound8
1] = Sound8
66
             | Bool
otherwise = Sound8
64
тьT [Sound8]
_ = Sound8
64

фT :: FlowSound -> Sound8
фT :: [Sound8] -> Sound8
фT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | [Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
36
            | Bool
otherwise = Sound8
43
фT [Sound8]
_ = Sound8
43

хT :: FlowSound -> Sound8
хT :: [Sound8] -> Sound8
хT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | [Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
21
            | Bool
otherwise = Sound8
52
хT [Sound8]
_ = Sound8
52

цT :: Array Int (Int8,Bool) -> Array Int ([Int8],Bool) -> Array Int ([Int8],Bool) -> FlowSound -> Sound8
цT :: Array Int (Sound8, Bool)
-> Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool)
-> [Sound8]
-> Sound8
цT Array Int (Sound8, Bool)
tup8 Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10 t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_)
  | ((Array Int (Sound8, Bool) -> [Sound8] -> Bool
isVoicedObstruentH Array Int (Sound8, Bool)
tup8 forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1) Bool -> Bool -> Bool
&& forall a. Int -> [a] -> [a]
drop Int
1 (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1) forall a. Eq a => a -> a -> Bool
== [Sound8
7]) Bool -> Bool -> Bool
||
      [Sound8] -> Bool
isVoicedObstruentS (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1) = Sound8
12
  | Array Int ([Sound8], Bool)
-> Array Int ([Sound8], Bool) -> [Sound8] -> Bool
isSoftDOrL Array Int ([Sound8], Bool)
tup9 Array Int ([Sound8], Bool)
tup10 [Sound8]
t1 = Sound8
66
  | Array Int (Sound8, Bool) -> [Sound8] -> Bool
isVoicedObstruentH Array Int (Sound8, Bool)
tup8 forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
8
  | Bool
otherwise = Sound8
38
цT Array Int (Sound8, Bool)
_ Array Int ([Sound8], Bool)
_ Array Int ([Sound8], Bool)
_ [Sound8]
_ = Sound8
38

цьT :: FlowSound -> Sound8
цьT :: [Sound8] -> Sound8
цьT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | ([Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1) Bool -> Bool -> Bool
&& forall a. Int -> [a] -> [a]
drop Int
1 (Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1) forall a. Eq a => a -> a -> Bool
== [Sound8
7] = Sound8
12
             | Bool
otherwise = Sound8
66
цьT [Sound8]
_ = Sound8
66

чT :: FlowSound -> Sound8
чT :: [Sound8] -> Sound8
чT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
49,Sound8
7],[Sound8
38,Sound8
7]] Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
54],[Sound8
66]] = Sound8
66
            | [Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
23
            | Bool
otherwise = Sound8
39
чT [Sound8]
_ = Sound8
39

шT :: FlowSound -> Sound8
шT :: [Sound8] -> Sound8
шT t1 :: [Sound8]
t1@(Sound8
_:[Sound8]
_) | Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
2 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
49,Sound8
7],[Sound8
38,Sound8
7]] Bool -> Bool -> Bool
|| Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 [Sound8]
t1 forall a. Eq a => a -> [a] -> Bool
`elem` [[Sound8
54],[Sound8
66]] = Sound8
54
            | [Sound8] -> Bool
isVoicedObstruent forall b c a. (b -> c) -> (a -> b) -> a -> c
.  Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
1 forall a b. (a -> b) -> a -> b
$ [Sound8]
t1 = Sound8
10
            | Bool
otherwise = Sound8
41
шT [Sound8]
_ = Sound8
41

takeFromFT :: Int -> FlowSound -> FlowSound
takeFromFT :: Int -> [Sound8] -> [Sound8]
takeFromFT Int
n [Sound8]
ts | if Int
n forall a. Ord a => a -> a -> Bool
< Int
1 then Bool
True else forall a. [a] -> Bool
null [Sound8]
ts = []
                | Int
n forall a. Ord a => a -> a -> Bool
< Int
2 = [Sound8
k]
                | Bool
otherwise = Sound8
k forall a. a -> [a] -> [a]
: Int -> [Sound8] -> [Sound8]
takeFromFT (Int
n forall a. Num a => a -> a -> a
- Int
1) (forall a. Int -> [a] -> [a]
take (Int
n forall a. Num a => a -> a -> a
- Int
1) [Sound8]
ts)
    where k :: Sound8
k = forall a. [a] -> a
head [Sound8]
ts

takeFromFT2 :: Int -> FlowSound -> FlowSound
takeFromFT2 :: Int -> [Sound8] -> [Sound8]
takeFromFT2 Int
n [Sound8]
ts | if Int
n forall a. Ord a => a -> a -> Bool
< Int
1 then Bool
True else forall a. [a] -> Bool
null [Sound8]
ts = []
                 | Int
n forall a. Ord a => a -> a -> Bool
< Int
2 = [Sound8
ks]
                 | Bool
otherwise = Sound8
ksforall a. a -> [a] -> [a]
:Int -> [Sound8] -> [Sound8]
takeFromFT2 (Int
n forall a. Num a => a -> a -> a
- Int
1) (forall a. [a] -> [a]
tail [Sound8]
ts)
    where ks :: Sound8
ks = forall a. [a] -> a
head [Sound8]
ts

dropFromFT2 :: Int -> FlowSound -> FlowSound
dropFromFT2 :: Int -> [Sound8] -> [Sound8]
dropFromFT2 Int
n [Sound8]
ts | if Int
n forall a. Ord a => a -> a -> Bool
< Int
1 then Bool
True else forall a. [a] -> Bool
null [Sound8]
ts = []
                 | Int
n forall a. Ord a => a -> a -> Bool
< Int
2 = forall a. [a] -> [a]
tail [Sound8]
ts
                 | Bool
otherwise = Int -> [Sound8] -> [Sound8]
dropFromFT2 (Int
n forall a. Num a => a -> a -> a
- Int
1) (forall a. [a] -> [a]
tail [Sound8]
ts)

takeFromFT_ :: Int -> FlowSound -> FlowSound
takeFromFT_ :: Int -> [Sound8] -> [Sound8]
takeFromFT_ Int
n = Int -> [Sound8] -> [Sound8]
takeFromFT Int
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (\Sound8
t -> Sound8
t forall a. Ord a => a -> a -> Bool
> Sound8
0 Bool -> Bool -> Bool
&& Sound8
t forall a. Ord a => a -> a -> Bool
< Sound8
100)

correctA :: Array Int (Int8,[Int8]) -> FlowSound -> FlowSound
correctA :: Array Int (Sound8, [Sound8]) -> [Sound8] -> [Sound8]
correctA Array Int (Sound8, [Sound8])
tup12 = [Sound8] -> [Sound8]
correctSomeW forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array Int (Sound8, [Sound8]) -> [Sound8] -> [Sound8]
separateSoftS Array Int (Sound8, [Sound8])
tup12

separateSoftS :: Array Int (Int8,[Int8]) -> FlowSound -> FlowSound
separateSoftS :: Array Int (Sound8, [Sound8]) -> [Sound8] -> [Sound8]
separateSoftS Array Int (Sound8, [Sound8])
tup12 = forall a b. (a -> [b]) -> [a] -> [b]
concatMap (\Sound8
x -> forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' ([Sound8
x], Array Int (Sound8, [Sound8])
tup12) Sound8
x)

correctSomeW :: FlowSound -> FlowSound
correctSomeW :: [Sound8] -> [Sound8]
correctSomeW (Sound8
x:Sound8
y:Sound8
z:xs :: [Sound8]
xs@(Sound8
t:[Sound8]
ys))
 | Sound8
x forall a. Eq a => a -> a -> Bool
== Sound8
50 Bool -> Bool -> Bool
&& Sound8
y forall a. Eq a => a -> a -> Bool
== Sound8
7 Bool -> Bool -> Bool
&& Sound8
z forall a. Eq a => a -> a -> Bool
== Sound8
54 Bool -> Bool -> Bool
&& Sound8
t forall a. Eq a => a -> a -> Bool
== Sound8
1 = Sound8
66forall a. a -> [a] -> [a]
:Sound8
66forall a. a -> [a] -> [a]
:Sound8
1forall a. a -> [a] -> [a]
:[Sound8] -> [Sound8]
correctSomeW [Sound8]
ys
 | (Sound8
x forall a. Ord a => a -> a -> Bool
> Sound8
99) Bool -> Bool -> Bool
&& Sound8
y forall a. Eq a => a -> a -> Bool
== Sound8
27 Bool -> Bool -> Bool
&& Sound8
z forall a. Eq a => a -> a -> Bool
== Sound8
1 =
  if forall a. Int -> [a] -> [a]
take Int
2 [Sound8]
xs forall a. Eq a => a -> a -> Bool
== [Sound8
39,Sound8
32]
    then Sound8
xforall a. a -> [a] -> [a]
:Sound8
yforall a. a -> [a] -> [a]
:Sound8
zforall a. a -> [a] -> [a]
:Sound8
41forall a. a -> [a] -> [a]
:[Sound8] -> [Sound8]
correctSomeW [Sound8]
ys
    else Sound8
xforall a. a -> [a] -> [a]
:[Sound8] -> [Sound8]
correctSomeW (Sound8
yforall a. a -> [a] -> [a]
:Sound8
zforall a. a -> [a] -> [a]
:[Sound8]
xs)
                        | Bool
otherwise = Sound8
xforall a. a -> [a] -> [a]
:[Sound8] -> [Sound8]
correctSomeW (Sound8
yforall a. a -> [a] -> [a]
:Sound8
zforall a. a -> [a] -> [a]
:[Sound8]
xs)
correctSomeW [Sound8]
zs = [Sound8]
zs

correctB :: FlowSound -> FlowSound
correctB :: [Sound8] -> [Sound8]
correctB ys :: [Sound8]
ys@(Sound8
x:[Sound8]
xs)
  | (forall a. [a] -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (forall a. Eq a => a -> a -> Bool
== Sound8
100) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Sound8] -> [Sound8]
takeFromFT2 Int
6 forall a b. (a -> b) -> a -> b
$ [Sound8]
ys) forall a. Ord a => a -> a -> Bool
> Int
1 = forall a b. (a -> b) -> [a] -> [b]
map (\Sound8
t -> if Sound8
t forall a. Ord a => a -> a -> Bool
>= Sound8
100 then Sound8
101 else Sound8
t) (Int -> [Sound8] -> [Sound8]
takeFromFT2 Int
6 [Sound8]
ys) forall a. [a] -> [a] -> [a]
++ [Sound8] -> [Sound8]
correctB (Int -> [Sound8] -> [Sound8]
dropFromFT2 Int
6 [Sound8]
ys)
  | Bool
otherwise = (if Sound8
x forall a. Ord a => a -> a -> Bool
> Sound8
100 then Sound8
101 else Sound8
x)forall a. a -> [a] -> [a]
:[Sound8] -> [Sound8]
correctB [Sound8]
xs
correctB [Sound8]
_ = []

-- | Can be used to map the 'Sound8' representation and the mmsyn6ukr-array files with some recordings.
linkFileNameI8 :: Sound8 -> Char
linkFileNameI8 :: Sound8 -> Char
linkFileNameI8 Sound8
x = forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstLSorted' Char
'0' ([(Sound8
1,Char
'A'),(Sound8
2,Char
'H'),(Sound8
3,Char
'Q'),(Sound8
4,Char
'W'),(Sound8
5,Char
'K'),(Sound8
6,Char
'e'),(Sound8
7,Char
'd'),(Sound8
8,Char
'G'),(Sound8
10,Char
'I'),(Sound8
15,Char
'B'),
  (Sound8
17,Char
'E'),(Sound8
19,Char
'f'),(Sound8
21,Char
'D'),(Sound8
23,Char
'F'),(Sound8
25,Char
'J'),(Sound8
27,Char
'L'),(Sound8
28,Char
'N'),(Sound8
30,Char
'O'),(Sound8
32,Char
'P'),(Sound8
34,Char
'S'),(Sound8
36,Char
'C'),(Sound8
38,Char
'Z'),(Sound8
39,Char
'b'),
    (Sound8
41,Char
'c'),(Sound8
43,Char
'X'),(Sound8
45,Char
'M'),(Sound8
47,Char
'R'),(Sound8
49,Char
'T'),(Sound8
50,Char
'V'),(Sound8
52,Char
'Y'),(Sound8
54,Char
'U'),(Sound8
60,Char
'0'),(Sound8
61,Char
'0'),(Sound8
66,Char
'a')]) Sound8
x