make :: (MonadRandom m, Ord c, Ord tc, Ord tv)
  => TcEnv v c tc tv -> BuiltIn c tc tv
  -> ( DataGenMap c tc tv (Sized m), DataGenMap c tc tv m
     , Map tc [(Int, DataPat c tc tv)], Map tc [(Int, DataPat c tc tv)] )
make env bi = (gen, baseGen, inlined, inlinedBase)
  where
    gBuiltIn = mkGBuiltIn bi
    inl@(inlined, inlinedBase) = inlineDataGen env gBuiltIn
    baseGen = createBaseGen env gBuiltIn inlinedBase
    gen = createDataGen env gBuiltIn baseGen inl
make :: (MonadRandom m, Ord c, Ord tc, Ord tv)
  => TcEnv v c tc tv -> BuiltIn c tc tv
  -> ( DataGenMap c tc tv (Sized m), DataGenMap c tc tv m
     , Map tc [(Int, DataPat c tc tv)], Map tc [(Int, DataPat c tc tv)] )
make env bi = (gen, baseGen, inlined, inlinedBase)
  where
    gBuiltIn = mkGBuiltIn bi
    inl@(inlined, inlinedBase) = inlineDataGen env gBuiltIn
    baseGen = createBaseGen env gBuiltIn inlinedBase
    gen = createDataGen env gBuiltIn baseGen inl
make env bi = (gen, baseGen, inlined, inlinedBase)
  where
    gBuiltIn = mkGBuiltIn bi
    inl@(inlined, inlinedBase) = inlineDataGen env gBuiltIn
    baseGen = createBaseGen env gBuiltIn inlinedBase
    gen = createDataGen env gBuiltIn baseGen inl