marionetta 0.1.0.1 → 0.1.0.3
raw patch · 13 files changed
+217/−112 lines, 13 filesdep +splinesdep +vectordep +vector-spacedep ~containersdep ~glossdep ~mtl
Dependencies added: splines, vector, vector-space
Dependency ranges changed: containers, gloss, mtl
Files
- Controller.hs +42/−30
- Data/List/Zipper.hs +7/−2
- Data/Tree/Missing.hs +12/−3
- Data/Zip.hs +5/−2
- Gloss.hs +3/−3
- IFigura.hs +3/−7
- Math.hs +49/−0
- Model.hs +15/−35
- Movie.hs +52/−0
- Run.hs +4/−4
- View.hs +21/−9
- gloss.patch +0/−13
- marionetta.cabal +4/−4
Controller.hs view
@@ -1,23 +1,25 @@ {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE GADTs #-} -module Controller (Evento (..), catchEvento, mkWorld, World (..), Lasso (..), Verso (..)) where+module Controller (Evento (..), catchEvento, mkWorld, World (..), Lasso (..), Verso (..), updateTime) where import Data.Maybe (fromMaybe)+import Control.Arrow (first, second) import Data.List.Zipper (mkZipper, Zipper , inserisci, elimina, destra, sinistra, modifica)-import Data.Tree.Missing (inspectTop , forward, backward)-import Model (Figura, Punto)-import IFigura (IFigura(IFigura), traslazione, rotazione, movimentoCentroTop, modificaSelettori, ricentra, iselectors)--data MoveEffect = Ruotando Punto | Traslando Punto | SpostandoCentro Punto | Niente+import Data.Tree.Missing (inspectTop , forward, backward, topSelector)+import Model (Figura, Punto(..), vicino, assolutizza, Tempo (..), Normalizzato)+import IFigura (IFigura(IFigura), ifigura , traslazione, rotazione, movimentoCentroTop, modificaSelettori, ricentra, iselectors)+import Movie -data World = World (Zipper IFigura) MoveEffect+data MoveEffect = Ruotando Punto | Traslando Punto | SpostandoCentro Punto | SpostandoFulcrum Punto| Niente +data World = World (Tempo Normalizzato) (Zipper (IFigura,Fulcrum)) MoveEffect mkWorld :: Figura -> World mkWorld fig = World - (mkZipper $ IFigura fig [] (forward (inspectTop fig) fig) (backward (inspectTop fig) fig))+ (Tempo 0)+ (mkZipper $ (IFigura fig [] (forward (inspectTop fig) fig) (backward (inspectTop fig) fig), Fulcrum (topSelector fig) $ Punto (0,0))) Niente data Lasso = Inizio | Fine@@ -36,33 +38,43 @@ Seleziona :: Punto -> Evento Deseleziona :: Evento Silent :: Evento+ SpostamentoFulcrum :: Punto -> Lasso -> Evento+ RicentraFulcrum :: Punto -> Evento +modificaIFigura f = modifica $ first f+modificaFulcrum f = modifica $ second f+ catchEvento :: Evento -> World -> World-catchEvento Refresh (World z _) = World z Niente-catchEvento (Puntatore p) (World z Niente) = World z Niente-catchEvento (Puntatore p) (World z (Traslando q)) = World (modifica (traslazione q p) z) $ Traslando p -catchEvento (Puntatore p) (World z (Ruotando q)) = World (modifica (rotazione q p) z) $ Ruotando p -catchEvento (Puntatore p) (World z (SpostandoCentro q)) = World (modifica (movimentoCentroTop q p) z) $ SpostandoCentro p -catchEvento (Rotazione p Inizio) (World z _) = World z (Ruotando p)-catchEvento (Rotazione p Fine) (World z (Ruotando _)) = World z Niente+catchEvento Refresh (World t z _) = World t z Niente+catchEvento (Puntatore p) (World t z Niente) = World t z Niente+catchEvento (Puntatore p) (World t z (Traslando q)) = World t (modificaIFigura (traslazione q p) z) $ Traslando p +catchEvento (Puntatore p) (World t z (Ruotando q)) = World t (modificaIFigura (rotazione q p) z) $ Ruotando p +catchEvento (Puntatore p) (World t z (SpostandoCentro q)) = World t (modificaIFigura (movimentoCentroTop q p) z) $ SpostandoCentro p +catchEvento (Puntatore p) (World t z (SpostandoFulcrum q)) = World t (modificaFulcrum (\ful -> ful {fulcrum = q}) z) $ SpostandoFulcrum p +catchEvento (Rotazione p Inizio) (World t z _) = World t z (Ruotando p)+catchEvento (Rotazione p Fine) (World t z (Ruotando _)) = World t z Niente catchEvento (Rotazione p Fine) w = w-catchEvento (Traslazione p Inizio) (World z _) = World z (Traslando p)-catchEvento (Traslazione p Fine) (World z (Traslando _)) = World z Niente+catchEvento (Traslazione p Inizio) (World t z _) = World t z (Traslando p)+catchEvento (Traslazione p Fine) (World t z (Traslando _)) = World t z Niente catchEvento (Traslazione p Fine) w = w-catchEvento (SpostamentoCentro p Inizio) (World z _) = World z (SpostandoCentro p)-catchEvento (SpostamentoCentro p Fine) (World z (SpostandoCentro _)) = World z Niente+catchEvento (SpostamentoCentro p Inizio) (World t z _) = World t z (SpostandoCentro p)+catchEvento (SpostamentoCentro p Fine) (World t z (SpostandoCentro _)) = World t z Niente catchEvento (SpostamentoCentro p Fine) w = w-catchEvento Cancella (World z m) = World (fromMaybe z $ elimina z) m-catchEvento Clona (World z m) = World (inserisci id z) m-catchEvento (Fuoco Destra) (World z m) = World (destra z) m-catchEvento (Fuoco Sinistra) (World z m) = World (sinistra z) m-catchEvento (Seleziona p) (World z m) = World (modifica (modificaSelettori p) z) m-catchEvento Deseleziona (World z m) = World (modifica f z) m where+catchEvento Cancella (World t z m) = World t (fromMaybe z $ elimina z) m+catchEvento Clona (World t z m) = World t (inserisci id z) m+catchEvento (Fuoco Destra) (World t z m) = World t (destra z) m+catchEvento (Fuoco Sinistra) (World t z m) = World t (sinistra z) m+catchEvento (Seleziona p) (World t z m) = World t (modificaIFigura (modificaSelettori p) z) m+catchEvento Deseleziona (World t z m) = World t (modificaIFigura f z) m where f ifig = ifig {iselectors = []}-catchEvento (Ricentra p) (World z m) = World (modifica (ricentra p) z) m+catchEvento (Ricentra p) (World t z m) = World t (modificaIFigura (ricentra p) z) m catchEvento Silent w = w----+catchEvento (SpostamentoFulcrum p Inizio) (World t z _) = World t z (SpostandoFulcrum p)+catchEvento (SpostamentoFulcrum p Fine) (World t z (SpostandoFulcrum _)) = World t z Niente+catchEvento (SpostamentoFulcrum p Fine) w = w+catchEvento (RicentraFulcrum p) (World t z m) = World t (modifica f z) m where+ f (ifi, Fulcrum _ q) = (ifi, Fulcrum (vicino p (assolutizza $ ifigura ifi)) q) +updateTime :: Float -> World -> World+updateTime ((/3) -> t) (World (tempo -> t') z m) = World (Tempo t'') z m where+ t'' = if t + t' > 1 then 0 else t + t'
Data/List/Zipper.hs view
@@ -17,7 +17,9 @@ module Data.List.Zipper where -data Zipper a = Zipper [a] [a]+data Zipper a = Zipper [a] [a] +instance Functor Zipper where+ fmap f (Zipper xs ys) = Zipper (fmap f xs) (fmap f ys) sinistra z@(Zipper [] _) = z sinistra (Zipper (x:xs) ys) = Zipper xs (x:ys)@@ -25,6 +27,9 @@ destra z@(Zipper _ [x]) = z destra (Zipper xs (y:ys)) = Zipper (y:xs) ys +isLast (Zipper [] _) = True+isLast _ = False+ mkZipper x = Zipper [] [x] valore (Zipper _ (x:_)) = x @@ -35,7 +40,7 @@ elimina (Zipper xs (y:ys)) = Just (Zipper xs ys) modifica f (Zipper xs (y:ys)) = Zipper xs (f y : ys)-elementi (Zipper xs ys) = xs ++ ys+elementi (Zipper xs ys) = reverse xs ++ ys
Data/Tree/Missing.hs view
@@ -12,16 +12,16 @@ ----------------------------------------------------------------------------- -{-# LANGUAGE ScopedTypeVariables, NoMonomorphismRestriction #-}+{-# LANGUAGE ScopedTypeVariables, NoMonomorphismRestriction, Rank2Types, ImpredicativeTypes #-} -module Data.Tree.Missing (inspectTop, modifyTop, recurseTreeAccum, backward, forward, Routing, routingDumb) where+module Data.Tree.Missing (inspectTop, modifyTop, recurseTreeAccum, backward, forward, Routing, routingDumb, fromSelector, topSelector) where import Prelude hiding (zipWith) import Control.Monad (msum) import Data.List (splitAt,inits,tails) import Data.Tree (Tree (Node)) -import Data.Zip (Zip (..))+import Data.Zip (Zip (..), labella, Selector , Label, mkSelector) @@ -69,5 +69,14 @@ routingDumb :: Routing b -> Tree b -> Tree b routingDumb r = snd . r undefined (const id)++topSelector :: Tree a -> Selector Tree b+topSelector t = mkSelector (==0) $ labella t++fromSelector :: Tree a -> Selector Tree Label -> (forall c . Routing c, forall c . Routing c)+fromSelector ifig ir = let+ lifig = labella ifig+ r = head $ snd (ir lifig)+ in (forward r lifig, backward r lifig)
Data/Zip.hs view
@@ -38,12 +38,15 @@ ch f (x,y) | t x = f y | otherwise = y -labella :: Traversable t => [a] -> t b -> t a-labella xs = snd . mapAccumL (\(x:xs) _ -> (xs,x)) xs+type Label = Int +labella :: Traversable t => t b -> t Label+labella = snd . mapAccumL (\(x:xs) _ -> (xs,x)) [0..]+ moveSelector :: (Functor t, Foldable t, Traversable t, Zip t) => t a -> (forall a . t a -> t a) -> Selector t Bool -> Selector t b moveSelector tr r s = mkSelector id . r $ fst (s . fmap (const False) $ tr) (const True)+ filterDuplicates :: forall t a b . (Functor t, Foldable t, Traversable t, Zip t) => t a -> (forall b . [Selector t b]) -> [Selector t b]
Gloss.hs view
@@ -3,9 +3,9 @@ import Data.Monoid (mconcat) -import Graphics.Gloss.Interface.Game +import Graphics.Gloss.Interface.Pure.Game (Picture(..), translate, rotate, color- , yellow, white, Event (..), gameInWindow+ , yellow, white, Event (..), play, Display (..) , scale, blue, makeColor, Key (..), MouseButton (..), SpecialKey (..), KeyState (..)) import View (RenderHelp, Colore, Render)@@ -51,4 +51,4 @@ gloss_implementazione = Implementazione renderPezzo colore renderHelp glCatch gloss_run :: String -> (Int,Int) -> (Int,Int) -> Run Picture Event-gloss_run s c l w rew ce = gameInWindow s c l white 0 w rew ce (const id)+gloss_run s c l w rew ce up = play (InWindow s c l) white 100 w rew ce up
IFigura.hs view
@@ -1,12 +1,11 @@ {-# LANGUAGE Rank2Types #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE NoMonomorphismRestriction #-}-{-# LANGUAGE ImpredicativeTypes #-} module IFigura where import Data.Tree (Tree)-import Data.Tree.Missing (routingDumb, forward, backward,modifyTop, Routing)+import Data.Tree.Missing (routingDumb, forward, backward,modifyTop, Routing, fromSelector) import Data.Zip (Selector, moveSelector, filterDuplicates, labella) import Model (Figura, ruotaScelto, vicino, Punto (..), Pezzo (..), assolutizza, relativizza,rotazioneInOrigine, routingPezzi) @@ -22,11 +21,8 @@ ricentra l (IFigura ifig isels _ ibackw ) = let ifig' = rotazioneInOrigine . routingPezzi undefined ibackw $ assolutizza ifig isels' = map (moveSelector ifig $ routingDumb ibackw) isels- ir = vicino l ifig'- lifig = labella [0..] ifig'- c = head $ snd (ir lifig)- iforw = forward c lifig- ibackw' = backward c lifig+ ir = vicino l ifig' + (iforw , ibackw') = fromSelector ifig' ir ifig'' = relativizza . rotazioneInOrigine . routingPezzi undefined iforw $ ifig' isels'' = map (moveSelector ifig' $ routingDumb iforw) isels' in IFigura ifig'' isels'' iforw ibackw'
+ Math.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE TypeFamilies, GeneralizedNewtypeDeriving #-}+module Math where++import Data.VectorSpace++-- | un punto nel piano 2d ascissa e ordinata o anche un vettore+newtype Punto = Punto (Float,Float) deriving (Eq,Show, Read, AdditiveGroup)++-- | un angolo+type Angolo = Float++-- campo dei Punto+instance Num Punto where+ (+) (Punto (x,y)) (Punto (x1,y1)) = Punto (x+x1,y+y1)+ negate (Punto (x,y)) = Punto (negate x,negate y)+ (*) = error "Punto Num method undefined used"+ abs x = error $ "abs :" ++ show x ++ " Punto Num method undefined used"+ signum = error "signum : Punto Num method undefined used"+ fromInteger x = error $ "fromInteger " ++ show x ++ ": Punto Num method undefined used"+++instance VectorSpace Punto where+ type Scalar Punto = Float+ t *^ (Punto (x,y)) = Punto (x * t,y * t)+++type Ruota = Punto -> Punto++-- rotazione intorno all'origine+ruota :: Angolo -> Ruota+ruota alpha (Punto (x,y))= Punto (cos alpha * x - sin alpha * y, sin alpha * x + cos alpha * y)+++-- modulo di un vettore+modulus :: Punto -> Float+modulus (Punto (x,y)) = sqrt (x ^ 2 + y ^ 2)+++pointOfOnlyRotation :: (Punto,Angolo) -> (Punto,Angolo) -> Punto+pointOfOnlyRotation (p1,alpha1) (p2,alpha2) = let + dp@(Punto (dpx,dpy)) = p2 - p1+ s = modulus (p2 - p1)+ x = Punto (s/2 , 0)+ y = Punto (0, s / 2 / tan (alpha / 2))+ alpha = alpha2 - alpha1+ beta = atan2 dpy dpx+ in ruota beta (y - x) + p2 ++
Model.hs view
@@ -3,46 +3,22 @@ {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} -module Model where -- (Punto (..), Semiretta (..), Angolo , TreePath, Tree, Accelerazione, configura, film) where+module Model (Punto (..), Angolo, Pezzo (..), rotazioneInOrigine, routingPezzi+ , ruotaScelto, vicino, Figura , relativizza, assolutizza, Assoluto, Relativo, Normalizzato, Tempo (..) , interpolazione) where import Prelude hiding (zipWith)+import Data.VectorSpace ((*^)) import Data.Tree (Tree(..))-import Data.Tree.Missing ( recurseTreeAccum, Routing, modifyTop)+import Data.Tree.Missing ( recurseTreeAccum, Routing, modifyTop, inspectTop) import Control.Applicative ((<$>)) import Control.Monad (ap) import Data.Foldable (minimumBy, toList) import Data.List.Zipper import Data.Ord (comparing) import Control.Arrow (Arrow(..))-import Debug.Trace+import Math import Data.Zip---- | un punto nel piano 2d ascissa e ordinata o anche un vettore-newtype Punto = Punto (Float,Float) deriving (Eq,Show, Read)---- | un angolo-type Angolo = Float---- campo dei Punto-instance Num Punto where- (+) (Punto (x,y)) (Punto (x1,y1)) = Punto (x+x1,y+y1)- negate (Punto (x,y)) = Punto (negate x,negate y)- (*) = error "Punto Num method undefined used"- abs x = error $ "abs :" ++ show x ++ " Punto Num method undefined used"- signum = error "signum : Punto Num method undefined used"- fromInteger x = error $ "fromInteger " ++ show x ++ ": Punto Num method undefined used"---type Ruota = Punto -> Punto---- rotazione intorno all'origine-ruota :: Angolo -> Ruota-ruota alpha (Punto (x,y))= Punto (cos alpha * x - sin alpha * y, sin alpha * x + cos alpha * y)----- modulo di un vettore-modulus :: Punto -> Float-modulus (Punto (x,y)) = sqrt (x ^ 2 + y ^ 2)+import Debug.Trace data Relativo data Assoluto@@ -54,9 +30,6 @@ } deriving (Show,Read,Eq) --- assolutizza :: Tree (Pezzo Relativo) -> Tree (Pezzo Assoluto) assolutizza = recurseTreeAccum (Punto (0,0)) f where f q (Pezzo c o alpha) = (qc, Pezzo qc (o + qc) alpha ) where qc = q + c@@ -97,12 +70,19 @@ (.-.) :: Tempo Assoluto -> Tempo Assoluto -> Tempo Relativo (.-.) = tf (-) +normalizzaAngolo alpha+ | alpha < -pi = normalizzaAngolo $ alpha + 2 * pi+ | alpha > pi = normalizzaAngolo $ alpha - 2 * pi+ | otherwise = alpha interpolazione :: Tree (Pezzo Relativo) -> Tree (Pezzo Relativo) -> Tempo Normalizzato -> Tree (Pezzo Relativo)-interpolazione t1 t2 t = aggiorna $ zipWith variazioneAngolo t1 t2 where- variazioneAngolo p p' = ((rotazionePezzo p' - rotazionePezzo p) / tempo t, p)+interpolazione t1 t2 t = modifyTop (\(Pezzo _ r alpha) -> Pezzo (l t) r alpha) . aggiorna $ zipWith variazioneAngolo t1 t2 where+ variazioneAngolo p p' = (tempo t * ((normalizzaAngolo $ rotazionePezzo p') - (normalizzaAngolo $ rotazionePezzo p)), p)+ l t = l0 + tempo t *^ (l1 - l0) + l0 = fulcroPezzo (inspectTop t1)+ l1 = fulcroPezzo (inspectTop t2) type Figura = Tree (Pezzo Relativo)
+ Movie.hs view
@@ -0,0 +1,52 @@+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE ImpredicativeTypes #-}+module Movie where++import Prelude hiding (foldr, zipWith)+import Data.Foldable+++import Math.Spline.BSpline+import Math.Spline.Knots (Knots)++import Data.Tree++import Data.Vector (fromList)++import Math ++import Model++import Data.List.Zipper++import Data.Tree.Missing++import Data.Zip++type Index = Int+++spline :: Knots Float -> [Pezzo Assoluto] -> BSpline Punto+spline x = bSpline x . fromList . map originePezzo +++type Movie = [Tree (Pezzo Assoluto)]++splines :: Knots Float -> Movie -> Tree (BSpline Punto)+splines x (y:ys) = fmap (spline x) . foldr (zipWith (:)) (fmap return y) $ ys+splines x [] = error "empty movie to spline"++generaPasso :: Tree (Pezzo Assoluto) -> Tree (Pezzo Assoluto) -> Fulcrum -> Tempo Normalizzato -> Figura +generaPasso fp fa (Fulcrum s p) = let + (forw,_) = fromSelector fp s+ fp' = relativizza $ fp+ fa' = relativizza $ fa+ in interpolazione fp' fa'++data Fulcrum = Fulcrum + { legato :: Selector Tree Label+ , fulcrum :: Punto+ }++
Run.hs view
@@ -5,7 +5,7 @@ import Model (Pezzo (Pezzo), Punto (Punto), Assoluto, relativizza) import View (Render, Colore, RenderHelp, renderWorld)-import Controller (World(World), Evento, mkWorld, catchEvento)+import Controller (World(World), Evento, mkWorld, catchEvento, updateTime) data Geometrici = Ge@@ -35,11 +35,11 @@ , catturaEvento :: e -> Evento } -type Run b e = World -> (World -> b) -> (e -> World -> World) -> IO ()+type Run b e = World -> (World -> b) -> (e -> World -> World) -> (Float -> World -> World) -> IO () run :: Monoid b => Run b e -> Implementazione b e -> Descrizione -> IO ()-run f (Implementazione mks co mo ca) de = f w rew cat where- rew = renderWorld co mo (fmap (mks . snd) de) . (\(World ifig _) -> ifig)+run f (Implementazione mks co mo ca) de = f w rew cat updateTime where+ rew = renderWorld co mo (fmap (mks . snd) de) cat = catchEvento . ca w = mkWorld (relativizza $ fmap (mkPezzo . fst) de)
View.hs view
@@ -1,17 +1,19 @@+{-# LANGUAGE ViewPatterns #-} module View (RenderHelp, Render, Colore, renderWorld) where import Prelude hiding (zipWith) import Data.Tree (Tree) import Data.Foldable (toList)-import Data.Monoid (mconcat,Monoid)+import Data.Monoid (mconcat,Monoid,mempty) import Data.Zip (zipWith) import Data.Tree.Missing (modifyTop, routingDumb)-import Data.List.Zipper (Zipper, elementi, valore)-import Model (assolutizza , Pezzo , Assoluto, Figura)+import Data.List.Zipper (Zipper, elementi, valore, destra, sinistra, isLast)+import Model (assolutizza , Pezzo , Assoluto, Figura, Tempo, Normalizzato, routingPezzi, rotazioneInOrigine) import IFigura (IFigura(IFigura))-+import Controller (World (..))+import Movie type Render b = Pezzo Assoluto -> b @@ -33,11 +35,21 @@ type RenderHelp b = [String] -> b -renderWorld :: Monoid b => Colore b -> RenderHelp b -> Tree (Render b) -> Zipper IFigura -> b-renderWorld co he re ca = let- ps = mconcat . map (renderIFigura co re) $ elementi ca- actual = renderIFigura co re . valore $ ca- in mconcat [co text $ he help, co (0.5,0.5,0.5) ps, co (0.1,0.1,0.1) actual]++film = (0.7,0.7,0.7)++renderMovie :: Monoid b => Tree (Render b) -> Tempo Normalizzato -> ((IFigura, Fulcrum), (IFigura, Fulcrum)) -> b+renderMovie re t ((IFigura ifig _ _ back,fu), (IFigura ifig2 _ _ back2,_)) = let + ifig' = rotazioneInOrigine . routingPezzi undefined back $ assolutizza ifig+ ifig'' = rotazioneInOrigine . routingPezzi undefined back2 $ assolutizza ifig2+ in renderFigura re . generaPasso ifig' ifig'' fu $ t ++renderWorld :: Monoid b => Colore b -> RenderHelp b -> Tree (Render b) -> World -> b+renderWorld co he re (World t z _) = let+ xs = elementi z+ ms = co film . mconcat . map (renderMovie re t) . zip xs $ tail xs+ actual = renderIFigura co re . fst . valore $ z+ in mconcat [co text $ he help, actual, ms] help = [ "S: select/deselect nearest to pointer piece for rotation" , "Space: deselect all pieces"
− gloss.patch
@@ -1,13 +0,0 @@---- Graphics/Gloss/Internals/Interface/Backend/GLUT.hs 2011-11-16 09:58:40.359886120 +0100-+++ Graphics/Gloss/Internals/Interface/Backend/GLUT.patched.hs 2011-11-16 09:58:57.951886166 +0100-@@ -239,7 +239,9 @@- -> IO ()- - installMotionCallbackGLUT ref callbacks-- = GLUT.motionCallback $= Just (callbackMotion ref callbacks)-+ = do GLUT.motionCallback $= Just (callbackMotion ref callbacks)-+ GLUT.passiveMotionCallback $= Just (callbackMotion ref callbacks)-+- - callbackMotion- :: IORef GLUTState -> [Callback]
marionetta.cabal view
@@ -7,7 +7,7 @@ -- The package version. See the Haskell package versioning policy -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for -- standards guiding when and how versions should be incremented.-Version: 0.1.0.1+Version: 0.1.0.3 -- A short (one-line) description of the package. Synopsis: A study of marionetta movements.@@ -40,7 +40,7 @@ -- Extra files to be distributed with the package, such as examples or -- a README.-Extra-source-files: gloss.patch+Extra-source-files: -- Constraint on the version of Cabal needed to build this package. Cabal-version: >=1.2@@ -51,10 +51,10 @@ Main-is: marionetta.hs -- Packages needed in order to build this package.- Build-depends: base >=4 && <5, mtl -any, containers -any , gloss -any+ Build-depends: base >=4 && <5, mtl >= 0.2.0.1, containers >= 0.4.2.1 , gloss == 1.7.4.1, splines == 0.3, vector-space == 0.8.0, vector == 0.9.1 -- Modules not exported by this package.- Other-modules: Controller Data.List.Zipper Data.Tree.Missing Data.Zip Gloss IFigura Model View Run+ Other-modules: Controller Data.List.Zipper Data.Tree.Missing Data.Zip Gloss IFigura Model View Run Math Movie -- Extra tools (e.g. alex, hsc2hs, ...) needed to build the source. -- Build-tools: