-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A library with less dependencies that can be used for multiple @Ord a => a -> b@ transformations. -- -- A library that can be used as a case ... of constuction -- analogue for the multiple Ord a => a -> b -- transformations and data representation. Uses GHC.Arr -- internally. If you use the module in GHCi, then, please, run the -- interpreter with the flag -fobject-code. @package mmsyn2-array @version 0.1.0.0 -- | A library that can be used as a case ... of constuction -- analogue for the multiple Ord a => a -> b -- transformations and data representation. Uses Array internally. -- If you use the module in GHCi, then, please, run the interpreter with -- the flag -fobject-code. module CaseBi.Arr -- | The function that can be used instead of the 'case ... of' function -- case var of a1 -> b1 a2 -> b2 a3 -> b3 ... an -> bn _ -- -> defaultValue If 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) complexity, the -- same as the proposed function getBFst'. 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. getBFst' uses binary search -- algorithm and an Array of (a, b) as somewhat like a -- complicated filter or like a special sieve. The array must be sorted -- in ascending order here for the algorithm to be used correctly. For -- this you can use the function listArrSortedBy or the similar -- ones. The function getBFst'' is used internally in the -- getBFst' that is recommended to be used in most cases. -- Nevertheless, it is provided here if you have precomputed the first -- two arguments or at least some parts of them so that you can reduce -- the needed amount of computations in the getBFst'. getBFst'' :: Ord a => (# Int, (a, b) #) -> (# Int, (a, b) #) -> Array i (a, b) -> b -> a -> b -- | A generally written without extending variant of the getBFst''. getBFst' :: Ord a => (b, Array Int (a, b)) -> a -> b -- | Sorts the list of pairs by the first element in the tuples, then -- transforms them into an immutable array. Can be used only if the list -- contains no more than 2^31 - 1 elements though this is not checked, it -- is up to user to check this constraint before or provide its -- correctness by design. listArrSortedByFst :: Ord a => [(a, b)] -> Array Int (a, b) -- | If the list argument is sorted in the ascending order by the first -- element in every tuple, then to reduce computations instead of -- def xs x -> getBFst' (def, listArray (0,length xs - 1) xs) x -- you can use this function. getBFstLSorted' :: Ord a => b -> [(a, b)] -> a -> b -- | If it is unknown whether the list argument is sorted in the ascending -- order by the first element in every tuple (or, definitely, it is not, -- speaking generally), then instead of def xs x -> getBFst' -- (def, listArray (0,length xs - 1) . sortBy (comparing fst) $ xs) x -- you can use this function. getBFstL' :: Ord a => b -> [(a, b)] -> a -> b