
Miguel Negrao wrote:
A 06/05/2012, às 14:31, Heinrich Apfelmus escreveu:
Ah, ok, then I don't understand your specification.
Could you give a specification in terms of a simple list transformation
example :: [Double] -> [Double]
? All list functions are allowed, we can then transform it into a style that uses only the combinators available in reactive-banana.
Ok, this should demonstrate an example of what I mean:
module Main where
main :: IO() main = print $ test [0.9,0.1,0.2,0.8] --should output [0.9,0.1,0.8,0.8]
test :: [Double]->[Double] test (x:xs) = x : test1 xs x test [] = []
test1:: [Double]->Double->[Double] test1 (x:xs) lastValue = let y = if lastValue>=0.8 then x else 1.0-x in if (y<=0.2) || (y>=0.8) then y : test1 xs y else test1 xs lastValue test1 [] _ = []
You can reformulate this function in terms of the mapAccum combinators from Data.List. Once you have done this, you can easily adapt it to the mapAccum combinator from reactive-banana. test :: Event t Double -> Event t Double test e = filterJust $ fst $ mapAccum Nothing $ next <$> e where next x Nothing = (Just x, Just x) next x (Just lastValue) = let y = if lastValue>=0.8 then x else 1.0-x in if (y<=0.2) || (y>=0.8) then (Just y , Just y) else (Nothing, Just lastValue) Best regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com