{-- TerraHS - Interface between TerraLib and Haskell

    (c) Sergio Costa (INPE) - Setembro, 2005

	This program is free software; you can redistribute it 
    and/or modify it under the terms of the GNU General 
    Public License 2.1 as published by the Free Software Foundation
    (http://www.opensource.org/licenses/gpl-license.php)
--}

{--  --}

module TerraHS.TerraLib.TeGeometry
	(
	-- * The @TeGeometry@ type
	TeGeometry (..),
	
	-- ** Operations on @TeGeometry@ 	
	pointset2geometryset, lineset2geometryset, polygonset2geometryset, cellset2geometryset

	)
	where


import Foreign
import Foreign.C.String
import qualified Foreign.Ptr (Ptr)

import qualified System.IO.Unsafe (unsafePerformIO)

import TerraHS.Misc.Generic -- funções genericas
import TerraHS.Misc.Object

import TerraHS.TerraLib.TePoint
import TerraHS.TerraLib.TeLine2D
import TerraHS.TerraLib.TeCell
import TerraHS.TerraLib.TeBox
import TerraHS.TerraLib.TePolygon

 		
data TeGeometry = GPt TePoint 
	| GPg TePolygon 
	| GLn TeLine2D
	| GCl TeCell
	deriving (Show,Eq)	

type TeGeometryPtr = Foreign.Ptr.Ptr TeGeometry



--class (Array a b) => ToTeGeometry a b where
--	toTeGeometry :: (Foreign.Ptr.Ptr a) -> Int32 -> Prelude.IO TeGeometry 
	
	
--instance ToTeGeometry TePointSet TePoint where

--	toTeGeometry ptr i = ((getElement ptr i)) >>= \phs -> return (GPt phs)
	

pointset2geometryset :: TePointSetPtr ->  Int32 -> Int32 -> Prelude.IO [TeGeometry]
pointset2geometryset gs i size = do
		if i >= size then return [] else (getElement gs i) >>= \x -> pointset2geometryset gs (i+1) size >>= \xs -> return  ((GPt x) : xs)
		
lineset2geometryset :: TeLineSetPtr ->  Int32 -> Int32 -> Prelude.IO [TeGeometry]
lineset2geometryset gs i size = do
		if i >= size then return [] else (getElement gs i) >>= \x -> lineset2geometryset gs (i+1) size >>= \xs -> return  ((GLn x) : xs)
		
polygonset2geometryset :: TePolygonSetPtr ->  Int32 -> Int32 -> Prelude.IO [TeGeometry]
polygonset2geometryset gs i size = do
		if i >= size then return [] else (getElement gs i) >>= \x -> polygonset2geometryset gs (i+1) size >>= \xs -> return  ((GPg x) : xs)

cellset2geometryset :: TeCellSetPtr ->  Int32 -> Int32 -> Prelude.IO [TeGeometry]
cellset2geometryset gs i size = do
		if i >= size then return [] else (getElement gs i) >>= \x -> cellset2geometryset gs (i+1) size >>= \xs -> return  ((GCl x) : xs)