packages feed

vector-doublezip (empty) → 0.1.0.0

raw patch · 5 files changed

+125/−0 lines, 5 filesdep +basedep +vectorsetup-changed

Dependencies added: base, vector

Files

+ ChangeLog.md view
@@ -0,0 +1,5 @@+# Revision history for vector-doublezip++## 0.1.0.0 -- 2020-06-01++* First version. Released on an unsuspecting world.
+ Data/Vector/DoubleZip.hs view
@@ -0,0 +1,73 @@+-- |+-- Module      :  Data.Vector.DoubleZip+-- Copyright   :  (c) OleksandrZhabenko 2020+-- License     :  MIT+-- Stability   :  Experimental+-- Maintainer  :  olexandr543@yahoo.com+--+-- Some special functions to work with Vector (with zip).++{-# OPTIONS_GHC -threaded #-}++module Data.Vector.DoubleZip (+  normFst+  , normSnd+  , evalFstFV+  , evalFstFVM+  , evalSndFV+  , evalSndFVM+) where++import qualified Data.Vector as V++-- | Norms a tuples in a 'V.Vector' by their first elements so that the greatest by an absolute value first element is equal to 1 (or -1). If all the first +-- elements are zeros then prints a warning message and exits successfully.+normFst :: (Fractional a, Ord a) => V.Vector (a, b) -> IO (V.Vector (a, b))+normFst v + | V.all (\(x,_) -> x == 0) v = putStrLn "Warning: Data.Vector.DoubleZip.normFst: Vector with all zero first parts of the elements." >> return v+ | otherwise = V.mapM (\(x,y) -> return (x / abs (V.maximumBy (\t u -> compare (abs t) (abs u)) . V.map fst $ v),y)) v++-- | Norms a tuples in a 'V.Vector' by their second elements so that the greatest by an absolute value second element is equal to 1 (or -1). If all the second +-- elements are zeros then prints a warning message and exits successfully.+normSnd :: (Fractional b, Ord b) => V.Vector (a, b) -> IO (V.Vector (a, b))+normSnd v + | V.all (\(_,y) -> y == 0) v = putStrLn "Warning: Data.Vector.DoubleZip.normSnd: Vector with all zero second parts of the elements." >> return v+ | otherwise = V.mapM (\(x,y) -> return (x,y / abs (V.maximumBy (\t u -> compare (abs t) (abs u)) . V.map snd $ v))) v++-- | A special function transformation to obtain the resulting 'V.Vector' so that its first elements in the inner tuples are in a special way +-- normed to 1 (or -1) by 'normFst' and the inner tuples are sequenced one by another as a 2D points of the generating function @f :: a -> b@. +-- To obtain non-empty result the given second argument must have at least two elements.+evalFstFV :: (Fractional a, Ord a) => (a -> b) -> V.Vector a -> IO (V.Vector ((a, b), (a, b)))+evalFstFV f v +  | compare (V.length v) 1 == GT = do+     zipped <- normFst . V.zip v $ V.map f v+     return . V.zip zipped . V.unsafeSlice 1 (V.length v - 1) $ zipped+  | otherwise = return V.empty     ++-- | The same as 'evalFstFV' but uses a monadic IO function f.+evalFstFVM :: (Fractional a, Ord a) => (a -> IO b) -> V.Vector a -> IO (V.Vector ((a, b), (a, b)))+evalFstFVM f v +  | compare (V.length v) 1 == GT = do+     v1 <- V.mapM f v+     zipped <- normFst . V.zip v $ v1+     return . V.zip zipped . V.unsafeSlice 1 (V.length v - 1) $ zipped+  | otherwise = return V.empty++-- | A special function transformation to obtain the resulting 'V.Vector' so that its second elements in the inner tuples are in a special way +-- normed to 1 (or -1) by 'normSnd' and the inner tuples are sequenced one by another as a 2D points of the generating function @f :: a -> b@. +-- To obtain non-empty result the given second argument must have at least two elements. Is similar to 'evalFstFV'.+evalSndFV :: (Fractional b, Ord b) => (a -> b) -> V.Vector a -> IO (V.Vector ((a, b), (a, b)))+evalSndFV f v +  | compare (V.length v) 1 == GT = do+     zipped <- normSnd . V.zip v $ V.map f v+     return . V.zip zipped . V.unsafeSlice 1 (V.length v - 1) $ zipped+  | otherwise = return V.empty     ++-- | The same as 'evalSndFV' but uses a monadic IO function f.+evalSndFVM :: (Fractional b, Ord b) => (a -> IO b) -> V.Vector a -> IO (V.Vector ((a, b), (a, b)))+evalSndFVM f v +  | compare (V.length v) 1 == GT = do+     v1 <- V.mapM f v+     zipped <- normSnd . V.zip v $ v1+     return . V.zip zipped . V.unsafeSlice 1 (V.length v - 1) $ zipped+  | otherwise = return V.empty
+ LICENSE view
@@ -0,0 +1,20 @@+Copyright (c) 2020 OleksandrZhabenko++Permission is hereby granted, free of charge, to any person obtaining+a copy of this software and associated documentation files (the+"Software"), to deal in the Software without restriction, including+without limitation the rights to use, copy, modify, merge, publish,+distribute, sublicense, and/or sell copies of the Software, and to+permit persons to whom the Software is furnished to do so, subject to+the following conditions:++The above copyright notice and this permission notice shall be included+in all copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ vector-doublezip.cabal view
@@ -0,0 +1,25 @@+-- Initial vector-doublezip.cabal generated by cabal init.  For further+-- documentation, see http://haskell.org/cabal/users-guide/++name:                vector-doublezip+version:             0.1.0.0+synopsis:            Some special functions to work with Vector (with zip).+description:         Uses normalizitions inside for the tuples. Can be used to generate a Vector of 2D function points.+homepage:            https://hackage.haskell.org/package/vector-doublezip+license:             MIT+license-file:        LICENSE+author:              OleksandrZhabenko+maintainer:          olexandr543@yahoo.com+-- copyright:+category:            Data+build-type:          Simple+extra-source-files:  ChangeLog.md+cabal-version:       >=1.10++library+  exposed-modules:     Data.Vector.DoubleZip+  -- other-modules:+  -- other-extensions:+  build-depends:       base >=4.7 && <4.15, vector >=0.11 && <0.14+  -- hs-source-dirs:+  default-language:    Haskell2010