packages feed

implicit-0.0.1: Graphics/Implicit/ExtOpenScad/Default.hs

-- Implicit CAD. Copyright (C) 2011, Christopher Olah (chris@colah.ca)
-- Released under the GNU GPL, see LICENSE

-- We'd like to parse openscad code, with some improvements, for backwards compatability.

module Graphics.Implicit.ExtOpenScad.Default where

import Graphics.Implicit.Definitions
import Graphics.Implicit.ExtOpenScad.Definitions
import Data.Map (Map, fromList)

defaultObjects :: VariableLookup -- = Map String OpenscadObj
defaultObjects = fromList $ 
	defaultConstants
	++ defaultFunctions
	++ defaultFunctions2
	++ defaultFunctionsSpecial

defaultConstants = map (\(a,b) -> (a, ONum b))
	[("pi", pi)]

defaultFunctions = map (\(a,b) -> (a, numericOFunc b))
	[
		("sin",   sin),
		("cos",   cos),
		("tan",   tan),
		("abs",   abs),
		("sign",  signum),
		("floor", fromIntegral . floor ),
		("ceil",  fromIntegral . ceiling ),
		("exp",   exp)
	]

defaultFunctions2 = map (\(a,b) -> (a, numericOFunc2 b))
	[
		("max", max),
		("min", min)
	]

defaultFunctionsSpecial = [("map", mapfunc)]

-- Stupid functions for convering to openscad objects follow:

mapfunc = OFunc $ \oObj -> case oObj of
	OFunc f -> OFunc $ \oObj2 -> case oObj2 of
		OList l -> OList $ map f l
		_ -> OUndefined
	_ -> OUndefined

numericOFunc f = OFunc $ \oObj -> case oObj of
	ONum n -> ONum $ f n
	_ -> OUndefined


numericOFunc2 f = OFunc $ \oObj -> case oObj of
	ONum n -> OFunc $ \oObj2 -> case oObj2 of
		ONum n2 -> ONum $ f n n2
		_ -> OUndefined
	_ -> OUndefined