/*
 * 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
 *
 *   https://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.
 *
 *   SPDX-License-Identifier: Apache-2.0
 */

package org.apache.jena.rdf.model.impl;


import java.util.*;

import org.apache.jena.graph.* ;
import org.apache.jena.rdf.model.* ;
import org.apache.jena.util.iterator.* ;


/**
 *  Builds Jena Iterators and other things (RDFNode and Statement)
 *  needed in a Model.
 */
public final class IteratorFactory
    {
    private IteratorFactory(){}

	/**
	 * 
	 */
	static public StmtIterator asStmtIterator( Iterator<Triple> i, final ModelCom m ) 
	    {
	    return new StmtIteratorImpl( WrappedIterator.create( i ).mapWith( t ->  m.asStatement( t ) ) );
	   }

	/**
	 * 
	 */
	static public ResIterator asResIterator( Iterator<Node> i, final ModelCom m) 
	    {
		return new ResIteratorImpl( WrappedIterator.create( i ).mapWith( o -> (Resource) m.asRDFNode( o ) ), null );
	    }

	/**
	 * 
	 */
	static public NodeIterator asRDFNodeIterator( Iterator<Node> i, final ModelCom m) 
	    {      
	    return new NodeIteratorImpl( WrappedIterator.create( i ).mapWith( o -> m.asRDFNode( o ) ), null );
	    }
	    
    static  Resource asResource( Node n, ModelCom m )  
        { return asResource( n, Resource.class, m );  }	    
    
    static Property asProperty( Node n, ModelCom m ) 
        { return (Property)asResource( n, Property.class, m ); }
    
    static Literal asLiteral(Node n,ModelCom m) 
        { return m.getNodeAs( n, Literal.class ); }
    
    static <X extends RDFNode> Resource asResource( Node n, Class<X> cl, ModelCom m ) 
        { return (Resource) m.getNodeAs( n, cl ); }
    }
