/*

* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

open module org.apache.arrow.dataset {
  exports org.apache.arrow.dataset.file;
  exports org.apache.arrow.dataset.source;
  exports org.apache.arrow.dataset.jni;
  exports org.apache.arrow.dataset.substrait;
  exports org.apache.arrow.dataset.scanner;

  requires org.apache.arrow.c;
  requires org.apache.arrow.memory.core;
  requires org.apache.arrow.vector;
}
