packages feed

3d-graphics-examples-0.0.0.0: src/l-systems/LSystem.hs

module LSystem (
  LSystem (..),
  LPrim (..),

  derivations,
  interprete,
  interpretations
  ) where

import Turtle


-- LSystem module = LSystem axiom ableitungsregeln
data LSystem m = LSystem [LPrim m] (m -> [LPrim m])

data LPrim m = LPrim m | LStack [LPrim m]



-------------------------------------------------------------------------------


-- Einzelnes, primitives Modul ableiten
derive :: (m -> [LPrim m]) -> LPrim m -> [LPrim m]
derive rules x = case x of
  LPrim p  -> rules p
  LStack s -> [LStack $ concatMap (derive rules) s]


-- Erzeugt Liste aller Ableitungen eines L-Systems
derivations :: LSystem m -> [ [LPrim m] ]
derivations (LSystem startword rules) = derivations'
  where
    derivations' = startword : map (concatMap $ derive rules) derivations'


-- Übersetzt ein Wort von Modulen des Typs m in ein Wort von Modulen des Typs
-- TurtleModule
interprete :: (m -> [LPrim TurtleModule]) -> [m] -> [LPrim TurtleModule]
interprete = concatMap


-- Wendet interprete auf eine Liste von Modulworten an
interpretations :: (m -> [LPrim TurtleModule]) -> [[LPrim m]] -> [[LPrim TurtleModule]]
interpretations rules = map (interprete intPrim)
  where
    intPrim x = case x of
      LPrim p  -> rules p
      LStack s -> [LStack $ (interprete intPrim) s]