-- |
-- Module      : Graphics.WaveFront.Parse
-- Description :
-- Copyright   : (c) Jonatan H Sundqvist, February 8 2015
-- License     : MIT
-- Maintainer  : Jonatan H Sundqvist
-- Stability   : experimental|stable
-- Portability : POSIX (not sure)
--
-- Created February 8 2015
-- Wavefront - Parsers.hs
-- Migrated to separate project on February 21 2015

-- TODO | - Appropriate container types (eg. bytestring, vector)
--        - Grammar specification
--        - Incremental parsing (?)
--        - Improve naming scheme
--          -- Remove 'parse-' prefix, import qualified (eg. 'Parse.obj')
--
--        - Separate MTL and OBJ parsers (?) (...)
--        - Separate parsing, processing, logging, IO and testing (...)
--          -- Proper path handling (eg. include root in MTLTable or not)
--
--        - Additional attributes (lighting, splines, etc.)
--        - FFI (...)
--        - Debugging information (line number, missing file, missing values, etc.) (...)
--        - Proper Haddock coverage, including headers (...)
--        - Model type (✓)
--        - Caching (?)
--        - Performance, profiling, optimisations
--          -- Strict or lazy (eg. with Data.Map) (?)
--          -- Multi-threading
--          -- Appropriate container types
--
--        - PrintfArg instances for the types defined in this module
--        - Reconciling Cabal and hierarchical modules
--        - Dealing with paths in lib statements (requires knowledge of working directories)
--        - Move comments and specification to separate files (eg. README)
--        - Inline comments (for internals, implementation)
--
--        - Full OBJ spec compliance
--          -- Do the usemtl and libmtl statements affect vertices or faces (?)
--
--        - Parser bugs
--          -- Negative coordinates enclosed in parentheses (✓)
--
--        - Decide on a public interface (exports) (API)
--          -- Model will be the main API type
--          -- Processing utils (eg. iterating over model faces; withModelFaces :: ((Material, [(Vertex, Maybe Normalcoords, Maybe Texcoords)]) -> b) -> Model -> [b])
--          -- Export functions for working with the output data (eg. unzipIndices :: [(Int, Int, Int)] -> ([Int], [Int], [Int]))
--          -- Export certain utilities (eg. second, perhaps in another module) (?)

-- SPEC | -
--        -



--------------------------------------------------------------------------------------------------------------------------------------------
-- GHC Extensions
--------------------------------------------------------------------------------------------------------------------------------------------
{-# LANGUAGE UnicodeSyntax     #-}
{-# LANGUAGE TupleSections     #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NamedFieldPuns    #-}



--------------------------------------------------------------------------------------------------------------------------------------------
-- API
--------------------------------------------------------------------------------------------------------------------------------------------
-- TODO | - Clean this up
--        - Decide on API
module Graphics.WaveFront.Parse (
  module Graphics.WaveFront.Types, -- TODO: Don't export internal types (duh)
  obj, mtl,
  comment, lineSeparator
) where



--------------------------------------------------------------------------------------------------------------------------------------------
-- We'll need these
--------------------------------------------------------------------------------------------------------------------------------------------
import Graphics.WaveFront.Parse.Common
import Graphics.WaveFront.Parse.OBJ (obj)
import Graphics.WaveFront.Parse.MTL (mtl)

import Graphics.WaveFront.Types