diff options
| author | Gregor Kleen <gkleen@yggdrasil.li> | 2018-05-15 15:57:09 +0200 |
|---|---|---|
| committer | Gregor Kleen <gkleen@yggdrasil.li> | 2018-05-15 15:57:09 +0200 |
| commit | cca9139ed34788e34da599abefd8b2c31cffdeec (patch) | |
| tree | c4ab677df76f38864d0dab3e2df003a53576d897 | |
| parent | 7885042246ac4a08e0f7b3ba27a7691a4908f3b6 (diff) | |
| download | trivmix-cca9139ed34788e34da599abefd8b2c31cffdeec.tar trivmix-cca9139ed34788e34da599abefd8b2c31cffdeec.tar.gz trivmix-cca9139ed34788e34da599abefd8b2c31cffdeec.tar.bz2 trivmix-cca9139ed34788e34da599abefd8b2c31cffdeec.tar.xz trivmix-cca9139ed34788e34da599abefd8b2c31cffdeec.zip | |
Fix handling of Balance
| -rw-r--r-- | src/Trivmix/Types.hs | 43 | ||||
| -rw-r--r-- | trivmix.cabal | 2 | ||||
| -rw-r--r-- | trivmix.nix | 2 | ||||
| -rw-r--r-- | trivmix/Trivmix.hs | 9 |
4 files changed, 48 insertions, 8 deletions
diff --git a/src/Trivmix/Types.hs b/src/Trivmix/Types.hs index abfdc43..fe44a27 100644 --- a/src/Trivmix/Types.hs +++ b/src/Trivmix/Types.hs | |||
| @@ -5,6 +5,9 @@ module Trivmix.Types | |||
| 5 | , Level(Lin), toLin | 5 | , Level(Lin), toLin |
| 6 | , toFloat | 6 | , toFloat |
| 7 | , asFloat | 7 | , asFloat |
| 8 | , Balance(..) | ||
| 9 | , bToFloat | ||
| 10 | , bAsFloat | ||
| 8 | , Adjustment(..) | 11 | , Adjustment(..) |
| 9 | , doAdjustment | 12 | , doAdjustment |
| 10 | , module Data.Default | 13 | , module Data.Default |
| @@ -31,7 +34,7 @@ instance Num Level where | |||
| 31 | (+) = fmap (either error id) . asFloat (+) | 34 | (+) = fmap (either error id) . asFloat (+) |
| 32 | (-) = fmap (either error id) . asFloat (-) | 35 | (-) = fmap (either error id) . asFloat (-) |
| 33 | (*) = fmap (either error id) . asFloat (*) | 36 | (*) = fmap (either error id) . asFloat (*) |
| 34 | abs = Lin . toLin | 37 | abs = id |
| 35 | signum = Lin . either error id . refine . signum . toFloat | 38 | signum = Lin . either error id . refine . signum . toFloat |
| 36 | fromInteger = Lin . either error id . refine . fromInteger | 39 | fromInteger = Lin . either error id . refine . fromInteger |
| 37 | 40 | ||
| @@ -82,9 +85,43 @@ instance Read Level where | |||
| 82 | instance Eq Level where | 85 | instance Eq Level where |
| 83 | (==) = (==) `on` toLin | 86 | (==) = (==) `on` toLin |
| 84 | 87 | ||
| 88 | instance Ord Level where | ||
| 89 | compare = compare `on` toLin | ||
| 90 | |||
| 85 | instance Default Level where | 91 | instance Default Level where |
| 86 | def = Lin $$(refineTH 0) | 92 | def = Lin $$(refineTH 0) |
| 87 | 93 | ||
| 94 | |||
| 95 | |||
| 96 | newtype Balance = Balance { unBalance :: Refined ZeroToOne Float } | ||
| 97 | deriving (Ord, Eq) | ||
| 98 | |||
| 99 | bAsFloat :: (Float -> Float -> Float) -> Balance -> Balance -> Either String Balance | ||
| 100 | bAsFloat f (unrefine . unBalance -> x) (unrefine . unBalance -> y) = fmap Balance . refine $ f x y | ||
| 101 | |||
| 102 | bToFloat :: Balance -> Float | ||
| 103 | bToFloat = unrefine . unBalance | ||
| 104 | |||
| 105 | instance Num Balance where | ||
| 106 | (+) = fmap (either error id) . bAsFloat (+) | ||
| 107 | (-) = fmap (either error id) . bAsFloat (-) | ||
| 108 | (*) = fmap (either error id) . bAsFloat (*) | ||
| 109 | abs = id | ||
| 110 | signum = Balance . either error id . refine . signum . bToFloat | ||
| 111 | fromInteger = Balance . either error id . refine . fromInteger | ||
| 112 | |||
| 113 | instance Show Balance where | ||
| 114 | show = show . bToFloat | ||
| 115 | |||
| 116 | instance Read Balance where | ||
| 117 | readsPrec = readPrec_to_S $ do | ||
| 118 | b <- readS_to_Prec readsPrec | ||
| 119 | either (const mzero) (return . Balance) $ refine b | ||
| 120 | |||
| 121 | instance Default Balance where | ||
| 122 | def = Balance $$(refineTH 1) | ||
| 123 | |||
| 124 | |||
| 88 | data Adjustment a = Set a | 125 | data Adjustment a = Set a |
| 89 | | Add a | 126 | | Add a |
| 90 | | Sub a | 127 | | Sub a |
| @@ -104,6 +141,10 @@ instance Adjustable Level where | |||
| 104 | sub (DB x) (DB y) = DB $ dBToLin $ ((-) `on` linToDb) x y | 141 | sub (DB x) (DB y) = DB $ dBToLin $ ((-) `on` linToDb) x y |
| 105 | sub x y = x - y | 142 | sub x y = x - y |
| 106 | 143 | ||
| 144 | instance Adjustable Balance where | ||
| 145 | add = (+) | ||
| 146 | sub = (-) | ||
| 147 | |||
| 107 | doAdjustment :: Adjustable a => a -> Adjustment a -> a | 148 | doAdjustment :: Adjustable a => a -> Adjustment a -> a |
| 108 | doAdjustment _ (Set y) = y | 149 | doAdjustment _ (Set y) = y |
| 109 | doAdjustment x (Add y) = add x y | 150 | doAdjustment x (Add y) = add x y |
diff --git a/trivmix.cabal b/trivmix.cabal index e39d451..e12ea00 100644 --- a/trivmix.cabal +++ b/trivmix.cabal | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | -- documentation, see http://haskell.org/cabal/users-guide/ | 2 | -- documentation, see http://haskell.org/cabal/users-guide/ |
| 3 | 3 | ||
| 4 | name: trivmix | 4 | name: trivmix |
| 5 | version: 3.1.1 | 5 | version: 3.1.2 |
| 6 | -- synopsis: | 6 | -- synopsis: |
| 7 | -- description: | 7 | -- description: |
| 8 | license: PublicDomain | 8 | license: PublicDomain |
diff --git a/trivmix.nix b/trivmix.nix index d77a0ee..416c55d 100644 --- a/trivmix.nix +++ b/trivmix.nix | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | }: | 5 | }: |
| 6 | mkDerivation { | 6 | mkDerivation { |
| 7 | pname = "trivmix"; | 7 | pname = "trivmix"; |
| 8 | version = "3.1.1"; | 8 | version = "3.1.2"; |
| 9 | src = ./.; | 9 | src = ./.; |
| 10 | isLibrary = true; | 10 | isLibrary = true; |
| 11 | isExecutable = true; | 11 | isExecutable = true; |
diff --git a/trivmix/Trivmix.hs b/trivmix/Trivmix.hs index 7743246..2e05b13 100644 --- a/trivmix/Trivmix.hs +++ b/trivmix/Trivmix.hs | |||
| @@ -42,12 +42,11 @@ import Data.Function | |||
| 42 | import Control.Monad | 42 | import Control.Monad |
| 43 | 43 | ||
| 44 | import Text.Heredoc (str) | 44 | import Text.Heredoc (str) |
| 45 | import Refined | 45 | |
| 46 | import Refined (refine) | ||
| 46 | 47 | ||
| 47 | import Trivmix.Types | 48 | import Trivmix.Types |
| 48 | 49 | ||
| 49 | type Balance = Refined ZeroToOne Float | ||
| 50 | |||
| 51 | data Options = Options | 50 | data Options = Options |
| 52 | { input :: String | 51 | { input :: String |
| 53 | , output :: String | 52 | , output :: String |
| @@ -86,7 +85,7 @@ optionParser = Options | |||
| 86 | <*> option auto ( long "initial-balance" | 85 | <*> option auto ( long "initial-balance" |
| 87 | <> metavar "BALANCE" | 86 | <> metavar "BALANCE" |
| 88 | <> help "Initial value for balance" | 87 | <> help "Initial value for balance" |
| 89 | <> value ($$(refineTH 1.0) :: Balance) | 88 | <> value def |
| 90 | <> showDefault | 89 | <> showDefault |
| 91 | ) | 90 | ) |
| 92 | <*> many ( strOption ( long "run" | 91 | <*> many ( strOption ( long "run" |
| @@ -161,7 +160,7 @@ trivmix Options{..} = do | |||
| 161 | delay = round $ recip fps * 1e6 | 160 | delay = round $ recip fps * 1e6 |
| 162 | linInt x a b = a * (1 - x) + b * x | 161 | linInt x a b = a * (1 - x) + b * x |
| 163 | linInt' x a b = either error id $ asFloat (linInt x) a b | 162 | linInt' x a b = either error id $ asFloat (linInt x) a b |
| 164 | mulBalance (unrefine -> b) x = either error id $ asFloat (*) (Lin . either error id $ refine b) x | 163 | mulBalance (bToFloat -> b) x = either error id $ asFloat (*) (Lin . either error id $ refine b) x |
| 165 | newLevel <- mulBalance <$> readMVar balance <*> readMVar level | 164 | newLevel <- mulBalance <$> readMVar balance <*> readMVar level |
| 166 | currentLevel <- readMVar level' | 165 | currentLevel <- readMVar level' |
| 167 | mapM_ (\x -> swapMVar level' (linInt' x currentLevel newLevel) >> threadDelay delay) ([0,recip frames..1] :: [Float]) | 166 | mapM_ (\x -> swapMVar level' (linInt' x currentLevel newLevel) >> threadDelay delay) ([0,recip frames..1] :: [Float]) |
