import Data.Attoparsec.Text import qualified Data.Text as T import Prelude hiding (takeWhile, take) data IndexedFace = IndexedFaceTriangle Int Int Int | IndexedFaceQuad Int Int Int Int deriving (Show) -- | block of faces-lines faces :: Parser [[(Int, IndexedFace)]] faces = faceLine `sepBy` endOfLine -- | Line containing up to two indexed faces faceLine :: Parser [(Int, IndexedFace)] faceLine = face `sepBy` (take 6) -- | single indexed-face face :: Parser (Int, IndexedFace) face = do i <- index v1 <- index v2 <- index v3 <- index v4 <- index case v4 of 0 -> return (i, IndexedFaceTriangle v1 v2 v3) _ -> return (i, IndexedFaceQuad v1 v2 v3 v4) -- | node or face index 6 wide index :: Parser Int index = do i <- take 6 return . read . T.unpack $ i test1 = do let ele = T.pack " 1 10 1 9 0 2 1 2 9 0\n" r = parse faceLine ele case r of Partial _ -> print $ feed r (T.pack "") _ -> print r test2 = do let eles = T.pack $ concat [" 1 10 1 9 0 2 1 2 9 0\n" ," 3 11 9 2 0\n" ," 4 12 8 1 0\n" ] r = parse faces eles case r of Partial _ -> print $ feed r (T.pack "") _ -> print r test3 = do let eles = T.pack $ concat [" 1 10 1 9 0 2 1 2 9 0\n" ," 3 11 9 2 0\n" ," 4 12 8 1 0\n" ] r = parse faces eles case r of Partial _ -> print $ feed r (T.pack "") _ -> print r test4 = do let eles = T.pack $ concat [" 1 10 1 9 0 2 1 2 9 0\n" ," 3 11 9 2 0\n" ," 4 12 8 1 0\n" ] r = parse faces eles case r of Partial _ -> print $ feed r (T.pack "") _ -> print r test5 = do let eles = T.pack $ concat [" 1 10 1 9 0 2 1 2 9 0\n" ," 3 11 9 2 0 4 12 8 1 0\n" ] r = parse faces eles case r of Partial _ -> print $ feed r (T.pack "") _ -> print r