type synonyms for growing stuff
authorJoachim Breitner <mail@joachim-breitner.de>
Mon, 2 Mar 2009 07:37:27 +0000 (08:37 +0100)
committerJoachim Breitner <mail@joachim-breitner.de>
Mon, 2 Mar 2009 07:37:27 +0000 (08:37 +0100)
src/Lseed/Data.hs
src/Lseed/LSystem.hs
src/main.hs

index 29b02e4..cdc6ab4 100644 (file)
@@ -9,6 +9,9 @@ import Data.Monoid
 -- | A list of plants, together with their position in the garden, in the interval [0,1]
 type Garden a = [ Planted a ]
 
+-- | Named variants of a garden, for more expressive type signatures
+type GrowingGarden = Garden (Maybe Double)
+
 -- | A plant with metainformatoin
 data Planted a = Planted
        { plantPosition :: Double -- ^ Position in the garden, interval [0,1]
@@ -16,6 +19,9 @@ data Planted a = Planted
        , phenotype     :: Plant a -- ^ Actual current form of the plant
        }
 
+-- | Named variants of a Planted, for more expressive type signatures
+type GrowingPlanted = Planted (Maybe Double)
+
 -- | A plant, which is
 data Plant a 
        -- | a bud, i.e. the end of a sprout
@@ -28,6 +34,9 @@ data Plant a
        | Fork a Double (Plant a) (Plant a)
        deriving (Show)
 
+-- | Named variants of a Plant, for more expressive type signatures
+type GrowingPlant = Plant (Maybe Double)
+
 -- | A (compiled) rule of an L-system, with a matching function and a weight
 type LRule = (Int, Plant () -> Maybe (Plant (Maybe Double)))
 
index 4c18531..4bfa0eb 100644 (file)
@@ -5,7 +5,7 @@ import Data.Maybe
 import Data.Monoid
 import System.Random
 
-applyLSystem :: RandomGen g => g -> LSystem -> Plant () -> Plant (Maybe Double)
+applyLSystem :: RandomGen g => g -> LSystem -> Plant () -> GrowingPlant
 applyLSystem rgen rules plant = if null choices
                           then unmodified plant
                            else chooseWeighted rgen choices
index c2d7a10..b4a4964 100644 (file)
@@ -42,13 +42,13 @@ main = do
                nextDay (succ day,finishGrowth garden')
        nextDay (0::Integer,testGarden)
 
-growGarden :: (RandomGen g) => g -> Garden () -> Garden (Maybe Double)
+growGarden :: (RandomGen g) => g -> Garden () -> GrowingGarden
 growGarden rgen = snd . mapAccumL go rgen 
   where go rgen planted = let (rgen1,rgen2) = split rgen in (rgen2, growPlanted rgen1 planted)
 
 -- | Applies an L-System to a Plant, putting the new length in the additional
 --   information field
-growPlanted :: (RandomGen g) => g -> Planted () -> Planted (Maybe Double)
+growPlanted :: (RandomGen g) => g -> Planted () -> GrowingPlanted
 growPlanted rgen planted =
        planted { phenotype = applyLSystem rgen (genome planted) (phenotype planted) }
 
@@ -57,10 +57,10 @@ finishGrowth :: Garden (Maybe Double) -> Garden ()
 finishGrowth = applyGrowth' (flip const)
 
 -- | Applies Growth at given fraction
-applyGrowth :: Double -> Garden (Maybe Double) -> Garden ()
+applyGrowth :: Double -> GrowingGarden -> Garden ()
 applyGrowth r = applyGrowth' (\a b -> a * (1-r) + b * r)
 
-applyGrowth' :: (Double -> Double -> Double) -> Garden (Maybe Double) -> Garden ()
+applyGrowth' :: (Double -> Double -> Double) -> GrowingGarden -> Garden ()
 applyGrowth' f = map (\planted -> planted { phenotype = go (phenotype planted) })
   where go (Bud Nothing) = Bud ()
         go (Stipe Nothing l p) = Stipe () l (go p)