frpnow 0.11 → 0.12
raw patch · 5 files changed
+183/−14 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Control.FRPNow.Lib: prev :: Eq a => a -> Behavior a -> Behavior (Behavior a)
+ Control.FRPNow.Time: (*^) :: VectorSpace v a => a -> v -> v
+ Control.FRPNow.Time: (^+^) :: VectorSpace v a => v -> v -> v
+ Control.FRPNow.Time: (^-^) :: VectorSpace v a => v -> v -> v
+ Control.FRPNow.Time: (^/) :: VectorSpace v a => v -> a -> v
+ Control.FRPNow.Time: class (Eq a, Eq v, Ord v, Ord a, Floating a) => VectorSpace v a | v -> a where v ^/ a = (1 / a) *^ v negateVector v = (- 1) *^ v v1 ^-^ v2 = v1 ^+^ negateVector v2 norm v = sqrt (v `dot` v) normalize v = if nv /= 0 then v ^/ nv else error "normalize: zero vector" where nv = norm v
+ Control.FRPNow.Time: delay :: Eq time => Behavior time -> a -> Behavior a -> Behavior (Behavior a)
+ Control.FRPNow.Time: dot :: VectorSpace v a => v -> v -> a
+ Control.FRPNow.Time: instance (Eq a, Floating a, Ord a) => VectorSpace (a, a) a
+ Control.FRPNow.Time: instance (Eq a, Floating a, Ord a) => VectorSpace (a, a, a) a
+ Control.FRPNow.Time: instance (Eq a, Floating a, Ord a) => VectorSpace (a, a, a, a) a
+ Control.FRPNow.Time: instance (Eq a, Floating a, Ord a) => VectorSpace (a, a, a, a, a) a
+ Control.FRPNow.Time: instance VectorSpace Double Double
+ Control.FRPNow.Time: instance VectorSpace Float Float
+ Control.FRPNow.Time: integrate :: (Show v, Show time, VectorSpace v time) => Behavior time -> Behavior v -> Behavior (Behavior v)
+ Control.FRPNow.Time: negateVector :: VectorSpace v a => v -> v
+ Control.FRPNow.Time: norm :: VectorSpace v a => v -> a
+ Control.FRPNow.Time: normalize :: VectorSpace v a => v -> v
+ Control.FRPNow.Time: zeroVector :: VectorSpace v a => v
Files
- ChangeLog +1/−0
- Control/FRPNow/Core.hs +14/−10
- Control/FRPNow/Lib.hs +10/−0
- Control/FRPNow/Time.hs +157/−3
- frpnow.cabal +1/−1
ChangeLog view
@@ -1,2 +1,3 @@+0.12 Fixed BehaviorFix, added integration 0.11 Fixed import applicative 0.1 Initial version
Control/FRPNow/Core.hs view
@@ -162,7 +162,10 @@ Occ b' -> runB b' E em' -> return (x, E em') switch' (B bm) (E em) = B $- em >>= \r -> case r of+ -- liftIO (traceIO "switching!") >>+ em >>= \r ->+ -- liftIO (traceIO "ran ev") >>+ case r of Never -> bm Occ b' -> runB b' E em' -> @@ -204,8 +207,8 @@ whenJust' (Const Nothing) = pure never whenJust' (Const (Just x)) = pure (pure x) whenJust' (B m) = B $ - do (h, t) <- m- case h of+ do (h, t) <- m+ case h of Just x -> return (return x, whenJust' <$> t) Nothing -> do en <- planM (runB . whenJust' <$> t)@@ -220,7 +223,7 @@ case h of Just x -> do v <- fst <$> runB x; return (pure v, whenJustSample' <$> t) Nothing -> do en <- planM (runB . whenJustSample' <$> t)- return (en >>= fst, en >>= snd)+ return (en >>= fst, never) instance Monad Behavior where return x = B $ return (x, never)@@ -228,8 +231,8 @@ instance MonadFix Behavior where mfix f = B $ mfix $ \(~(h,_)) ->- do ~(h',t) <- runB (f h)- return (h, mfix f <$ t)+ do (h',t) <- runB (f h)+ return (h', mfix f <$ t ) -- | Introduce a change over time. --@@ -262,7 +265,7 @@ -- If @b@ never again is positive then the result is 'never'. whenJust :: Behavior (Maybe a) -> Behavior (Event a)-whenJust b = memoB (whenJust' b)+whenJust b = (whenJust' b) -- | A more optimized version of:@@ -284,7 +287,7 @@ -- the behavior is sampled, an error is thrown. futuristic :: Behavior (Event a) -> Behavior (Event a) futuristic b = B $ do e <- makeLazy (joinEm <$> runB b) - return (fst <$> e, snd <$> e)+ return (fst <$> e,snd <$> e) where joinEm (e,es) = (,) <$> e <*> es unrunB :: (a,Event (Behavior a)) -> Behavior a @@ -503,11 +506,12 @@ tryPlans = ReaderT $ tryEm where tryEm env = do pl <- readIORef (plansRef env)- --putStrLn ("nr plans: " ++ show (length pl))+ -- putStrLn ("nr plans: " ++ show (length pl)) writeIORef (plansRef env) [] runReaderT (mapM_ tryPlan (reverse pl)) env tryPlan (SomePlan pr) = - do ps <- liftIO (deRef pr) + do -- liftIO (traceIO "plan!")+ ps <- liftIO (deRef pr) case ps of Just p -> do eres <- runE (planToEv p) case eres of
Control/FRPNow/Lib.hs view
@@ -23,6 +23,7 @@ cmpTime, EvOrd(..), -- * Fold and state+ prev, foldB, sampleUntil, -- * Sample behaviors on events@@ -59,6 +60,15 @@ boolToMaybe True = Just () boolToMaybe False = Nothing ++prev :: Eq a => a -> Behavior a -> Behavior (Behavior a)+prev i b = loop i where+ loop i = do e <- nxtCur+ return (i `step` e)+ nxtCur = futuristic $ + do cur <- b+ e <- change b+ planB (loop cur <$ e) -- | Gives at any point in time the event that the input behavior changes, and the new value of the input behavior. change :: Eq a => Behavior a -> Behavior (Event a)
Control/FRPNow/Time.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TupleSections,TypeOperators,MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-} ----------------------------------------------------------------------------- -- |@@ -16,7 +16,7 @@ -- The clock itself is created by a function specialized to the -- GUI library you are using FRP with such as 'Control.FRPNow.GTK.getClock' -module Control.FRPNow.Time(localTime,timeFrac, lastInputs, bufferBehavior,delayBy, delayByN) where+module Control.FRPNow.Time(localTime,timeFrac, lastInputs, bufferBehavior,delayBy, delayByN, delay, integrate, VectorSpace(..)) where import Control.FRPNow.Core import Control.FRPNow.Lib@@ -121,6 +121,160 @@ ((t1,v1) : (t2,v2) : rest) | sampleTime >= t2 -> loop n ((t2,v2) : rest) | otherwise -> v1 : loop (n-1) l- +++-- | Integration using rectangle rule approximation. Integration depends on when we start integrating so the result is @Behavior (Behavior v)@.+integrate :: (Show v, Show time, VectorSpace v time) => + Behavior time -> Behavior v -> Behavior (Behavior v)+integrate time v = do t <- time + vp <- delay time (t,zeroVector) ((,) <$> time <*> v)+ foldB add zeroVector $ (,) <$> vp <*> time+ where add total ((t1,v),t2) = total ^+^ (((t2 - t1) * 0.5) *^ v)+++-- | Delay a behavior by one tick of the clock. Occasionally useful to prevent immediate feedback loops.+delay :: Eq time => Behavior time -> a -> Behavior a -> Behavior (Behavior a)+delay time i b = loop i where+ loop i =+ do e <- futuristic $ + do (t,cur) <- (,) <$> time <*> b+ e <- when ((/= t) <$> time)+ return (cur <$ e)+ e' <- plan ( loop <$> e)+ return (i `step` e')++infixr *^+infixl ^/+infix 7 `dot`+infixl 6 ^+^, ^-^++-- | A type class for vector spaces. Stolen from Yampa. Thanks Henrik :)++-- Minimal instance: zeroVector, (*^), (^+^), dot+class (Eq a, Eq v, Ord v, Ord a, Floating a) => VectorSpace v a | v -> a where+ zeroVector :: v+ (*^) :: a -> v -> v+ (^/) :: v -> a -> v+ negateVector :: v -> v+ (^+^) :: v -> v -> v+ (^-^) :: v -> v -> v+ dot :: v -> v -> a+ norm :: v -> a+ normalize :: v -> v++ v ^/ a = (1/a) *^ v++ negateVector v = (-1) *^ v++ v1 ^-^ v2 = v1 ^+^ negateVector v2++ norm v = sqrt (v `dot` v)++ normalize v = if nv /= 0 then v ^/ nv else error "normalize: zero vector"+ where nv = norm v++------------------------------------------------------------------------------+-- Vector space instances for Float and Double+------------------------------------------------------------------------------++instance VectorSpace Float Float where+ zeroVector = 0++ a *^ x = a * x++ x ^/ a = x / a++ negateVector x = (-x)++ x1 ^+^ x2 = x1 + x2++ x1 ^-^ x2 = x1 - x2++ x1 `dot` x2 = x1 * x2+++instance VectorSpace Double Double where+ zeroVector = 0++ a *^ x = a * x++ x ^/ a = x / a++ negateVector x = (-x)++ x1 ^+^ x2 = x1 + x2++ x1 ^-^ x2 = x1 - x2++ x1 `dot` x2 = x1 * x2+++------------------------------------------------------------------------------+-- Vector space instances for small tuples of Floating+------------------------------------------------------------------------------++instance (Eq a, Floating a, Ord a) => VectorSpace (a,a) a where+ zeroVector = (0,0)++ a *^ (x,y) = (a * x, a * y)++ (x,y) ^/ a = (x / a, y / a)++ negateVector (x,y) = (-x, -y)++ (x1,y1) ^+^ (x2,y2) = (x1 + x2, y1 + y2)++ (x1,y1) ^-^ (x2,y2) = (x1 - x2, y1 - y2)++ (x1,y1) `dot` (x2,y2) = x1 * x2 + y1 * y2+++instance (Eq a, Floating a, Ord a) => VectorSpace (a,a,a) a where+ zeroVector = (0,0,0)++ a *^ (x,y,z) = (a * x, a * y, a * z)++ (x,y,z) ^/ a = (x / a, y / a, z / a)++ negateVector (x,y,z) = (-x, -y, -z)++ (x1,y1,z1) ^+^ (x2,y2,z2) = (x1+x2, y1+y2, z1+z2)++ (x1,y1,z1) ^-^ (x2,y2,z2) = (x1-x2, y1-y2, z1-z2)++ (x1,y1,z1) `dot` (x2,y2,z2) = x1 * x2 + y1 * y2 + z1 * z2+++instance (Eq a, Floating a, Ord a) => VectorSpace (a,a,a,a) a where+ zeroVector = (0,0,0,0)++ a *^ (x,y,z,u) = (a * x, a * y, a * z, a * u)++ (x,y,z,u) ^/ a = (x / a, y / a, z / a, u / a)++ negateVector (x,y,z,u) = (-x, -y, -z, -u)++ (x1,y1,z1,u1) ^+^ (x2,y2,z2,u2) = (x1+x2, y1+y2, z1+z2, u1+u2)++ (x1,y1,z1,u1) ^-^ (x2,y2,z2,u2) = (x1-x2, y1-y2, z1-z2, u1-u2)++ (x1,y1,z1,u1) `dot` (x2,y2,z2,u2) = x1 * x2 + y1 * y2 + z1 * z2 + u1 * u2+++instance (Eq a, Floating a, Ord a) => VectorSpace (a,a,a,a,a) a where+ zeroVector = (0,0,0,0,0)++ a *^ (x,y,z,u,v) = (a * x, a * y, a * z, a * u, a * v)++ (x,y,z,u,v) ^/ a = (x / a, y / a, z / a, u / a, v / a)++ negateVector (x,y,z,u,v) = (-x, -y, -z, -u, -v)++ (x1,y1,z1,u1,v1) ^+^ (x2,y2,z2,u2,v2) = (x1+x2, y1+y2, z1+z2, u1+u2, v1+v2)++ (x1,y1,z1,u1,v1) ^-^ (x2,y2,z2,u2,v2) = (x1-x2, y1-y2, z1-z2, u1-u2, v1-v2)++ (x1,y1,z1,u1,v1) `dot` (x2,y2,z2,u2,v2) =+ x1 * x2 + y1 * y2 + z1 * z2 + u1 * u2 + v1 * v2
frpnow.cabal view
@@ -1,5 +1,5 @@ Name: frpnow-Version: 0.11+Version: 0.12 Synopsis: Principled practical FRP Description: FRP with first-class behaviors and interalized IO, without space leaks License: BSD3