+read_em acc ('L' : xs) = read_em (WwLazy False : acc) xs
+read_em acc ('A' : xs) = read_em (WwLazy True : acc) xs
+read_em acc ('S' : xs) = read_em (WwStrict : acc) xs
+read_em acc ('P' : xs) = read_em (WwPrim : acc) xs
+read_em acc ('E' : xs) = read_em (WwEnum : acc) xs
+read_em acc (')' : xs) = [(reverse acc, xs)]
+read_em acc ( 'U' : '(' : xs) = do_unpack DataType True acc xs
+read_em acc ( 'u' : '(' : xs) = do_unpack DataType False acc xs
+read_em acc ( 'N' : '(' : xs) = do_unpack NewType True acc xs
+read_em acc ( 'n' : '(' : xs) = do_unpack NewType False acc xs
+read_em acc rest = [(reverse acc, rest)]
+
+do_unpack new_or_data wrapper_unpacks acc xs