matchData :: Expression -> Expression -> [Var] -> Expr Var -> DataCon -> Compile Expression
matchData object inner vars exp con = do
  if printName (dataConName con) == "ghc-prim:GHC.Types.I#"
     then do vs <- mapM compileVar vars
             fmap (bind vs (force object)) (compileExp exp)
     else if printName (dataConName con) == "ghc-prim:GHC.Types.True"
             then do vs <- mapM compileVar vars
                     fmap (bind vs (force object)) (compileExp exp)
             else if printName (dataConName con) == "ghc-prim:GHC.Types.False"
                     then do vs <- mapM compileVar vars
                             fmap (bind vs (force object)) (compileExp exp)
                     else do error ("no-o: " ++ T.unpack (printName (dataConName con)))
                             return inner
matchData :: Expression -> Expression -> [Var] -> Expr Var -> DataCon -> Compile Expression
matchData object inner vars exp con = do
  if printName (dataConName con) == "ghc-prim:GHC.Types.I#"
     then do vs <- mapM compileVar vars
             fmap (bind vs (force object)) (compileExp exp)
     else if printName (dataConName con) == "ghc-prim:GHC.Types.True"
             then do vs <- mapM compileVar vars
                     fmap (bind vs (force object)) (compileExp exp)
             else if printName (dataConName con) == "ghc-prim:GHC.Types.False"
                     then do vs <- mapM compileVar vars
                             fmap (bind vs (force object)) (compileExp exp)
                     else do error ("no-o: " ++ T.unpack (printName (dataConName con)))
                             return inner
matchData object inner vars exp con = do
  if printName (dataConName con) == "ghc-prim:GHC.Types.I#"
     then do vs <- mapM compileVar vars
             fmap (bind vs (force object)) (compileExp exp)
     else if printName (dataConName con) == "ghc-prim:GHC.Types.True"
             then do vs <- mapM compileVar vars
                     fmap (bind vs (force object)) (compileExp exp)
             else if printName (dataConName con) == "ghc-prim:GHC.Types.False"
                     then do vs <- mapM compileVar vars
                             fmap (bind vs (force object)) (compileExp exp)
                     else do error ("no-o: " ++ T.unpack (printName (dataConName con)))
                             return inner