summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-06-14 03:13:25 -0400
committerJoe Crayne <joe@jerkface.net>2019-06-14 03:13:25 -0400
commit15d46d75c67faa64425e1013957617239a9f4790 (patch)
treef3c1ce4ec2b5633bcd9c5a2885c72cb41b89f62e
parent773075e9dd7f0b29d00eee72bdeac5510d340b3a (diff)
nullBuilder accepts custom default action.
-rw-r--r--src/Wavefront.hs184
-rw-r--r--test/bench.hs2
2 files changed, 92 insertions, 94 deletions
diff --git a/src/Wavefront.hs b/src/Wavefront.hs
index 6200bf2..c5c8d1b 100644
--- a/src/Wavefront.hs
+++ b/src/Wavefront.hs
@@ -58,52 +58,52 @@ data ObjBuilder m = ObjBuilder
58 , badToken :: L.ByteString -> m () 58 , badToken :: L.ByteString -> m ()
59 } 59 }
60 60
61nullBuilder :: Applicative m => ObjBuilder m 61nullBuilder :: Applicative m => m () -> ObjBuilder m
62nullBuilder = ObjBuilder 62nullBuilder def = ObjBuilder
63 { vertex = \vs -> pure () 63 { vertex = \vs -> def
64 , vertexT = \vs -> pure () 64 , vertexT = \vs -> def
65 , vertexN = \vs -> pure () 65 , vertexN = \vs -> def
66 , vertexP = \vs -> pure () 66 , vertexP = \vs -> def
67 , face = \is -> pure () 67 , face = \is -> def
68 , cstype = \isRat typ -> pure () 68 , cstype = \isRat typ -> def
69 , curv2 = \is -> pure () 69 , curv2 = \is -> def
70 , curv = \u0 v0 is -> pure () 70 , curv = \u0 v0 is -> def
71 , parm = \uv is -> pure () 71 , parm = \uv is -> def
72 , specialPoints = \is -> pure () 72 , specialPoints = \is -> def
73 , endFreeForm = pure () 73 , endFreeForm = def
74 , ctech = \approx -> pure () 74 , ctech = \approx -> def
75 , stech = \approx -> pure () 75 , stech = \approx -> def
76 , deg = \is -> pure () 76 , deg = \is -> def
77 , surf = \u0 u1 v0 v1 ts -> pure () 77 , surf = \u0 u1 v0 v1 ts -> def
78 , trim = \ss -> pure () 78 , trim = \ss -> def
79 , hole = \ss -> pure () 79 , hole = \ss -> def
80 , specialCurves = \ss -> pure () 80 , specialCurves = \ss -> def
81 , equivalentCurves = \ccs -> pure () 81 , equivalentCurves = \ccs -> def
82 , groups = \gs -> pure () 82 , groups = \gs -> def
83 , smoothingGroup = \sg -> pure () 83 , smoothingGroup = \sg -> def
84 , mergingGroup = \mg δ -> pure () 84 , mergingGroup = \mg δ -> def
85 , usemtl = \mtl -> pure () 85 , usemtl = \mtl -> def
86 , deprecated_cdc = \is -> pure () 86 , deprecated_cdc = \is -> def
87 , deprecated_cdp = \is -> pure () 87 , deprecated_cdp = \is -> def
88 , deprecated_bzp = \is -> pure () 88 , deprecated_bzp = \is -> def
89 , deprecated_bsp = \is -> pure () 89 , deprecated_bsp = \is -> def
90 , mtllib = \fns -> pure () 90 , mtllib = \fns -> def
91 , objectName = \obn -> pure () 91 , objectName = \obn -> def
92 , bmat = \uv fs -> pure () 92 , bmat = \uv fs -> def
93 , step = \is -> pure () 93 , step = \is -> def
94 , points = \is -> pure () 94 , points = \is -> def
95 , usemap = \map -> pure () 95 , usemap = \map -> def
96 , maplib = \fns -> pure () 96 , maplib = \fns -> def
97 , c_interp = \b -> pure () 97 , c_interp = \b -> def
98 , d_interp = \b -> pure () 98 , d_interp = \b -> def
99 , trace_obj = \obj -> pure () 99 , trace_obj = \obj -> def
100 , shadow_obj = \obj -> pure () 100 , shadow_obj = \obj -> def
101 , deprecated_res = \is -> pure () 101 , deprecated_res = \is -> def
102 , bevel = \b -> pure () 102 , bevel = \b -> def
103 , lod = \lvl -> pure () 103 , lod = \lvl -> def
104 , call = \obj args -> pure () 104 , call = \obj args -> def
105 , command = \b cmd -> pure L.empty 105 , command = \b cmd -> def *> pure L.empty
106 , badToken = \bs -> pure () 106 , badToken = \bs -> def
107 } 107 }
108 108
109 109
@@ -188,53 +188,51 @@ findNewLine ps o@(ObjConfig args) bs = case L.break (\c -> c=='\n' || c=='\\' ||
188 else ds 188 else ds
189 Nothing -> (L.concat $ reverse $ ts : ps,L.empty) 189 Nothing -> (L.concat $ reverse $ ts : ps,L.empty)
190 190
191{- 191-- The 43 keywords of the OBJ file format:
192 192--
193 1 bevel 193-- 1 bevel
194 2 bmat 194-- 2 bmat
195 3 bsp 195-- 3 bsp
196 4 bzp 196-- 4 bzp
197 5 call 197-- 5 call
198 6 cdc 198-- 6 cdc
199 7 cdp 199-- 7 cdp
200 8 c_interp 200-- 8 c_interp
201 9 con 201-- 9 con
202 10 csh -- for all except these, 202-- 10 csh
203 11 cstype -- Two chars suffice to distinguish 203-- 11 cstype
204 12 ctech 204-- 12 ctech
205 13 curv2 -- for all except these, 205-- 13 curv2
206 14 curv -- Two chars suffice to distinguish 206-- 14 curv
207 15 deg 207-- 15 deg
208 16 d_interp 208-- 16 d_interp
209 17 end 209-- 17 end
210 18 f 210-- 18 f
211 19 g 211-- 19 g
212 20 hole 212-- 20 hole
213 21 lod 213-- 21 lod
214 22 maplib 214-- 22 maplib
215 23 mg 215-- 23 mg
216 24 mtllib 216-- 24 mtllib
217 25 o 217-- 25 o
218 26 p 218-- 26 p
219 27 parm 219-- 27 parm
220 28 res 220-- 28 res
221 29 s 221-- 29 s
222 30 scrv 222-- 30 scrv
223 31 shadow_obj 223-- 31 shadow_obj
224 32 sp 224-- 32 sp
225 33 stech -- for all except these, 225-- 33 stech
226 34 step -- Two chars suffice to distinguish 226-- 34 step
227 35 surf 227-- 35 surf
228 36 trace_obj -- for all except these, 228-- 36 trace_obj
229 37 trim -- Two chars suffice to distinguish 229-- 37 trim
230 38 usemap -- for all except these, 230-- 38 usemap
231 39 usemtl -- Two chars suffice to distinguish 231-- 39 usemtl
232 40 v 232-- 40 v
233 41 vn 233-- 41 vn
234 42 vp 234-- 42 vp
235 43 vt 235-- 43 vt
236
237-}
238 236
239nextToken :: (L.ByteString -> L.ByteString) -> L.ByteString -> L.ByteString 237nextToken :: (L.ByteString -> L.ByteString) -> L.ByteString -> L.ByteString
240nextToken tok bs = tok $ L.dropWhile (not . isSpace) bs 238nextToken tok bs = tok $ L.dropWhile (not . isSpace) bs
diff --git a/test/bench.hs b/test/bench.hs
index 3125ed9..bf60303 100644
--- a/test/bench.hs
+++ b/test/bench.hs
@@ -59,7 +59,7 @@ countVerticesSundqvist ts = List.length vs
59countVerticesCrayne :: L.ByteString -> Int 59countVerticesCrayne :: L.ByteString -> Int
60countVerticesCrayne bs = execState (parseOBJ builder (ObjConfig IntMap.empty) bs) 0 60countVerticesCrayne bs = execState (parseOBJ builder (ObjConfig IntMap.empty) bs) 0
61 where 61 where
62 builder = nullBuilder 62 builder = (nullBuilder $ return ())
63 { vertex = \_ -> modify succ 63 { vertex = \_ -> modify succ
64 } 64 }
65 65