packages feed

cakyrespa-0.0.28: src/Minde.hs

module Minde (minde) where

import Klesi(Minde(..), Sumti)

import Text.XML.YJSVG(showSVG)
import Graphics.UI.GLUT.Turtle(setFieldSize, Console, home,
	Field, consoleOutput, clear,
	Turtle, runInputs, inputs, getSVG,
	goto, forward, backward, left, right, beginfill, endfill, undo,
	penup, pendown, hideturtle, showturtle, shapesize,
	pensize, pencolor, fillcolor, bgcolor, windowWidth, windowHeight)

import Control.Applicative((<$>))
import Data.IORef(IORef, readIORef)
import Data.IORef.Tools(atomicModifyIORef_)

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

vabytcidu :: Eq a => a -> IORef [(a, b)] -> IO (Maybe b)
vabytcidu cmene vanbi = lookup cmene <$> readIORef vanbi

vabyciha :: a -> b -> IORef [(a, b)] -> IO ()
vabyciha cmene fasnu vanbi = atomicModifyIORef_ vanbi ((cmene, fasnu) :)

minde :: Field -> Console -> Turtle -> IORef [(String, [Sumti] -> Minde)] -> Minde -> IO Bool
minde _ _ t _ (KLAMA x y) = goto t x y >> return True
minde _ _ t _ (CRAKLA d) = forward t d >> return True
minde _ _ t _ (RIXYKLA d) = backward t d >> return True
minde _ _ t _ (ZUNLE d) = left t d >> return True
minde _ _ t _ (PRITU d) = right t d >> return True
minde _ _ t _ XRUKLALOKRASI = home t >> return True
minde _ _ t _ COhACLUGAU = beginfill t >> return True
minde _ _ t _ COhUCLUGAU = endfill t >> return True
minde _ _ t _ (PEBYCISNI s) = pensize t s >> return True
minde _ _ t _ (PEBYSKA r g b) = pencolor t (r, g, b) >> return True
minde _ _ t _ (BURSKA r g b) = fillcolor t (r, g, b) >> return True
minde _ _ t _ (FLOSKA r g b) = bgcolor t (r, g, b) >> return True
minde _ _ t _ NAPILNOLOPENBI = penup t >> return True
minde _ _ t _ PILNOLOPENBI = pendown t >> return True
minde _ _ t _ NAVISKA = hideturtle t >> return True
minde _ _ t _ VISKA = showturtle t >> return True
minde _ _ t _ (CISNI s) = shapesize t s s >> return True
minde f _ _ _ (CISNYGAUFOLDI w h) = setFieldSize f w h >> return True
minde _ _ t _ VIMCULOPIXRA = clear t >> return True
minde _ _ t _ XRUTI = undo t >> return True
minde _ _ _ vanbi (MORJI cmene fasnu) = vabyciha cmene fasnu vanbi >> return True
minde f c t vanbi (GASNU cmene sumti) = vabytcidu cmene vanbi >>=
	minde f c t vanbi . maybe (SRERA $ "not defined: " ++ cmene) ($ sumti)
minde _ _ t _ (REJGAUSETAICAK fp) = inputs t >>= writeFile fp . show >> return True
minde _ _ t _ (TCIDU fp) = readFile fp >>= runInputs t . read >> return True
minde _ _ t _ (REJGAUSETAISVG fp) = do
	w <- windowWidth t
	h <- windowHeight t
	svg <- getSVG t
	writeFile fp $ showSVG w h svg
	return True
minde _ _ _ _ (REJGAUSETAIJBO _) = return True
minde _ _ _ _ (TCIDUSETAIJBO _) = return True
minde _ _ _ _ COhO = return False
minde f c t vanbi (MIDYSTE cl) = mapWhile (minde f c t vanbi) cl
minde _ c _ _ (SRERA str) = do
	consoleOutput c ".i mi na jimpe"
	putStrLn $ "error: " ++ str
	return True

mapWhile :: Monad m => (a -> m Bool) -> [a] -> m Bool
mapWhile _ [] = return True
mapWhile f (x : xs) = do
	b <- f x
	if b then mapWhile f xs else return False