!YX(c) OleksandrZhabenko 2019MITolexandr543@yahoo.comNoneXYmmsyn2CThe function that can be used instead of the 'case ... of' function Rcase var of a1 -> b1 a2 -> b2 a3 -> b3 ... an -> bn _ -> defaultValueIf we follow a lot of teaching materials that explain the workflow of the construction we think that the complexity of it is about O(n) for the transformation of a to b here. David Feuer (david.feuer (at) gmail.com) said that 'case ... of' is already optimized in GHC. Some benchmarks show that its behaviour tends to be about of O(log n)0 complexity, the same as the proposed function . Nevertheless, the last one shows better performance in some situations, is rather general and can be used for another data representation. Therefore, it can be preferred in some situations. & uses binary search algorithm and a  (a, b)D as somewhat like a complicated filter or like a special sieve. The  (a, b) must be sorted in ascending order here for the algorithm to be used correctly. For this you can use the following functions  and . b before  (a, b), in the tuple in the type definition of the  must be a  defaultValue for 'case' above.  (a, b) corresponds to , a1 -> b1 a2 -> b2 a3 -> b3 ... an -> bnmmsyn2]The function that uses special realization of the binary search to effectively transform the  a to  b instead of simply use  Rcase var of a1 -> b1 a2 -> b2 a3 -> b3 ... an -> bn _ -> defaultValueThe  (a, b) must be sorted in ascending order here for the algorithm to be used correctly. For this you can use the following functions  and i. it can be used to simplify the procedure for optimizing the code for transformation of the Vector data.b after  (a, b) in the type definition of the  must be a  defaultValue for  case ... of above.  (a, b) corresponds to , a1 -> b1 a2 -> b2 a3 -> b3 ... an -> bnmmsyn2NThe function that uses special kind of bisection to effectively transform the [a] to [b] instead of simply use  Rcase var of a1 -> b1 a2 -> b2 a3 -> b3 ... an -> bn _ -> defaultValueA  (a, b) must be sorted in ascending order here for the algorithm to be used correctly. For this you can use the following functions  and . The function can be used to simplify the procedure for optimizing the code for transformation of the list data or to represent the data in another way.b after the  (a, b) in the type definition of the  must be a  defaultValue for  case ... of above.  (a, b) corresponds to , a1 -> b1 a2 -> b2 a3 -> b3 ... an -> bnmmsyn2Function that sorts a list of (a, b)3 tuples by the first argument and is inspired by 4 function (the last one can be used for sorting the (a, b) tuples where both the types of a and b have instances of the class ). It is inspired by the work: %https://wiki.haskell.org/Introductionmmsyn2#Function that prepares the list of (a, b) tuples representing the  Tcase var of a1 -> b1 a2 -> b2 a3 -> b3 ... an -> bn _ -> defaultValuefor usage in the  and  functions. The resulting  has for every a= only one element, which was the first in the list of tuples (a, b) after sorting by  function.mmsyn2Is used to filter [(a, b)]! of the corresponding values for getFstB' to obtain the  (a, b) such that the b# element for the sequence of pairs (a, b) with the same a is selected by the predicate p9 and is not necessarily the first one as it is for the getFstB'( function and its successors by default.mmsyn2bX is a default value that can be substituted if there is no correspendence in the set of (a, b) tuples (the 1 or irrefutable pattern analogue). Vector of the (a, b)b tuples that must be sorted in ascending order for the first argument. If there are several pairs (a, b) with the same a!, the function gives a resulting b" as if there is only the first onemmsyn21an element for which the corresponding resulting b must be foundmmsyn2 the resultmmsyn2 of the (a, b)A tuples that are sorted in ascending order for the first argumentmmsyn2Ta default value that can be substituted if there is no correspendence in the set of (a, b) tuples (the ! or irrefutable pattern analogue)mmsyn2a 5 needed to be transformed accordingly to the correct (a, b) tuple pairsmmsyn2the resulting mmsyn2 of the (a, b)E tuples that must be sorted in ascending order for the first argumentmmsyn2Ta default value that can be substituted if there is no correspendence in the set of (a, b) tuples (the ! or irrefutable pattern analogue)mmsyn2Ea list of values needed to be transformed accordingly to the correct (a, b) tuple pairsmmsyn2the resulting listmmsyn2IThe list of conditions that is then converted to the corresponding Vectormmsyn28the resulting sorted Vector that can be used further in  and its successors.mmsyn2The predicate p& used to select the only one value of b in the pairs (a, b) with the same a!. ^ If there are several pairs (a, b) for the same aB that satisfies a predicate then the first one is used. For large [(a, b)] ^ it can be rather complex.mmsyn2 The list of (a, b)D sorted in the ascending order by the first element a (e. g. by the  function)mmsyn2The resulting filtered  Vector (a, b); that can be used for getFstB' and its successor functions. Example: filterP (\(t, w) -> (t == "1") || (w > 'f')) . sortFst $ [("1",'a'),("4a",'k'),("4a",'b'),("4a",'c'),("4a",'d'),("4a",'e'),("b7",'c'),("b7",'k')] = [("1",'a'),("4a",'k'),("b7",'k')]   %mmsyn2-0.1.8.0-4Pw6uOsJlaH2ro4uLOLBgGCaseBi Data.ListsortgetBFst'getBFstVgetBFstsortFstsortFstVfilterP&vector-0.12.1.2-E9YBdJZ4ywF23gc9L8wAxp Data.VectorVectorghc-prim GHC.ClassesOrdbaseGHC.Base otherwise