// Path: fauxflake-core/src/main/java/com/github/rholder/fauxflake/api/EncodingProvider.java
// public interface EncodingProvider {
// 
//     /**
//      * Return a raw byte encoding of the given time and sequence number.
//      *
//      * @param time      a time value to encode
//      * @param sequence  a sequence value to encode
//      */
//     public byte[] encodeAsBytes(long time, int sequence);
// 
//     /**
//      * Return a Long encoding of the given the time and sequence number.
//      *
//      * @param time      a time value to encode
//      * @param sequence  a sequence value to encode
//      */
//     public long encodeAsLong(long time, int sequence);
// 
//     /**
//      * Return a String encoding of the given the time and sequence number.
//      *
//      * @param time      a time value to encode
//      * @param sequence  a sequence value to encode
//      */
//     public String encodeAsString(long time, int sequence);
// 
//     /**
//      * Return the maximum number of sequence numbers that can be encoded for a
//      * given time by this implementation.
//      */
//     public int maxSequenceNumbers();
// }
// 
// Path: fauxflake-core/src/main/java/com/github/rholder/fauxflake/api/Id.java
// public interface Id {
// 
//     /**
//      * Return a unique identifier as a long.
//      */
//     public long asLong();
// 
//     /**
//      * Return a unique identifier as bytes.
//      */
//     public byte[] asBytes();
// 
//     /**
//      * Return a unique identifier as a String.
//      */
//     public String asString();
// }


import com.github.rholder.fauxflake.api.EncodingProvider;
import com.github.rholder.fauxflake.api.Id;
/*
 * Copyright 2012-2014 Ray Holder
 *
 * Licensed 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.
 */

package com.github.rholder.fauxflake;


/**
 * Use an {@link EncodingProvider} to back an implementation of the {@link Id}
 * interface.
 */
public class EncodedId implements Id {

    private EncodingProvider encodingProvider;
    private long time;
    private int sequence;

    public EncodedId(EncodingProvider encodingProvider, long time, int sequence) {
        this.encodingProvider = encodingProvider;
        this.time = time;
        this.sequence = sequence;
    }

    @Override
    public long asLong() {
        return encodingProvider.encodeAsLong(time, sequence);
    }

    @Override
// Path: fauxflake-core/src/main/java/com/github/rholder/fauxflake/api/EncodingProvider.java
// public interface EncodingProvider {
// 
//     /**
//      * Return a raw byte encoding of the given time and sequence number.
//      *
//      * @param time      a time value to encode
//      * @param sequence  a sequence value to encode
//      */
//     public byte[] encodeAsBytes(long time, int sequence);
// 
//     /**
//      * Return a Long encoding of the given the time and sequence number.
//      *
//      * @param time      a time value to encode
//      * @param sequence  a sequence value to encode
//      */
//     public long encodeAsLong(long time, int sequence);
// 
//     /**
//      * Return a String encoding of the given the time and sequence number.
//      *
//      * @param time      a time value to encode
//      * @param sequence  a sequence value to encode
//      */
//     public String encodeAsString(long time, int sequence);
// 
//     /**
//      * Return the maximum number of sequence numbers that can be encoded for a
//      * given time by this implementation.
//      */
//     public int maxSequenceNumbers();
// }
// 
// Path: fauxflake-core/src/main/java/com/github/rholder/fauxflake/api/Id.java
// public interface Id {
// 
//     /**
//      * Return a unique identifier as a long.
//      */
//     public long asLong();
// 
//     /**
//      * Return a unique identifier as bytes.
//      */
//     public byte[] asBytes();
// 
//     /**
//      * Return a unique identifier as a String.
//      */
//     public String asString();
// }


// Path: fauxflake-core/src/main/java/com/github/rholder/fauxflake/EncodedId.java
import com.github.rholder.fauxflake.api.EncodingProvider;
import com.github.rholder.fauxflake.api.Id;

/*
 * Copyright 2012-2014 Ray Holder
 *
 * Licensed 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.
 */

package com.github.rholder.fauxflake;


/**
 * Use an {@link EncodingProvider} to back an implementation of the {@link Id}
 * interface.
 */
public class EncodedId implements Id {

    private EncodingProvider encodingProvider;
    private long time;
    private int sequence;

    public EncodedId(EncodingProvider encodingProvider, long time, int sequence) {
        this.encodingProvider = encodingProvider;
        this.time = time;
        this.sequence = sequence;
    }

    @Override
    public long asLong() {
        return encodingProvider.encodeAsLong(time, sequence);
    }

    @Override
    public byte[] asBytes() {