From a65cb2a1bcea3881c9b519e8bf0ee845ba0d4d07 Mon Sep 17 00:00:00 2001 From: Edward Kmett Date: Tue, 20 Nov 2012 15:22:12 -0500 Subject: [PATCH] Added a version of the turtle example from Seth Tisue's talk on lenses. --- examples/Turtle.hs | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 examples/Turtle.hs diff --git a/examples/Turtle.hs b/examples/Turtle.hs new file mode 100644 index 000000000..f7ebdfe81 --- /dev/null +++ b/examples/Turtle.hs @@ -0,0 +1,65 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE DeriveDataTypeable #-} +-- | A simple Turtle-graphics demonstration for modeling the location of a turtle. +-- +-- This is based on the code presented by Seth Tisue at the Boston Area Scala +-- Enthusiasts meeting during his lens talk. +-- +-- Usage: +-- +-- > def & forward 10 & down & color .~ red % turn (pi/2) & forward 5 +module Turtle where + +import Control.Lens hiding (up, down) +import Data.Default + +data Point = Point + { _x, _y :: Double + } deriving (Eq,Show) + +makeClassy ''Point + +instance Default Point where + def = Point def def + +data Color = Color + { _r, _g, _b :: Int + } deriving (Eq,Show) + +makeClassy ''Color + +red :: Color +red = Color 255 0 0 + +instance Default Color where + def = Color def def def + +data Turtle = Turtle + { _tPoint :: Point + , _tColor :: Color + , _heading :: Double + , _penDown :: Bool + } deriving (Eq,Show) + +makeClassy ''Turtle + +instance Default Turtle where + def = Turtle def def def False + +instance HasPoint Turtle where + point = tPoint + +instance HasColor Turtle where + color = tColor + +forward :: Double -> Turtle -> Turtle +forward d t = + t & y +~ d * cos (t^.heading) + & x +~ d * sin (t^.heading) + +turn :: Double -> Turtle -> Turtle +turn d = heading +~ d + +up, down :: Turtle -> Turtle +up = penDown .~ False +down = penDown .~ True