module Graphics.Liveplot.Utils(
dump
, dbg
, moveCam
, cnf
, cnfEndo
, rpad
, normalize
) where
import Prelude
import Control.Concurrent.STM
import Data.Monoid (All(..), Any(..))
import Data.Foldable (Foldable, foldMap,foldl',fold)
import Data.Set (Set)
import qualified Data.Set as S
import qualified Pipes.Prelude as P
import Linear hiding (normalize)
import MVC
import Graphics.GLUtil.Camera2D
import Graphics.GLUtil.Camera3D hiding (roll)
import Graphics.UI.GLFW
dump :: View a
dump = asSink (\_ -> return())
dbg :: (Show a) => View a
dbg = asSink (\e -> (putStrLn $ show e) >> return())
cnf :: (Foldable s, Foldable t) => s (t Bool) -> Bool
cnf = getAll . foldMap (All . getAny . foldMap Any)
cnfEndo :: (k -> s -> Bool) -> (k -> s -> s) -> [([[k]], a -> a)] -> s -> a -> a
cnfEndo p del = go
where go [] _ = id
go ((k,f):fs) s | cnf (fmap (fmap (`p` s)) k) = go fs (delAll k s) . f
| otherwise = go fs s
delAll k s = foldl' (flip del) s (fold k)
moveCam :: (Conjugate a, Epsilon a, RealFloat a) => Set Key -> Camera a -> Camera a
moveCam keys = cnfEndo S.member S.delete
[ ([shift, [Key'Left]], roll na)
, ([shift, [Key'Right]], roll pa)
, ([[Key'Left]], track (V2 np 0))
, ([[Key'Right]], track (V2 pp 0))
, ([[Key'Up]], track (V2 0 pp))
, ([[Key'Down]], track (V2 0 np))
, ([[Key'PageUp]], tilt (pa))
, ([[Key'PageDown]], tilt (na))
]
keys
where shift = [Key'LeftShift, Key'RightShift]
timeScale = 1
pp = 0.08 * timeScale
np = negate pp
pa = 2 * timeScale
na = negate pa
rpad :: Int -> a -> [a] -> [a]
rpad n x xs = xs ++ (take (n-(length xs)) $ repeat x)
scaleRange :: Fractional a => (a, a) -> (a, a) -> a -> a
scaleRange (fromLow, fromHigh) (toLow, toHigh) x = (x - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow
normRange :: Fractional a => (a, a) -> a -> a
normRange from = scaleRange from (-1, 1)
graphRange :: Fractional a => (a, a) -> a -> a
graphRange from = scaleRange from (0, 1)
normalize :: (Fractional b, Monad m) => (b, b) -> Pipe b b m r
normalize from = P.map (graphRange from)