module Llama.Internal.Foreign.State where

import Foreign
import Foreign.C
import Llama.Internal.Types

-- | LLAMA_API size_t llama_state_get_size(struct llama_context * ctx);
foreign import ccall "llama_state_get_size"
  c_llama_state_get_size ::
    CLlamaContext -> -- ctx
    IO CSize

-- | LLAMA_API size_t llama_state_get_data(struct llama_context * ctx, uint8_t * dst, size_t size);
foreign import ccall "llama_state_get_data"
  c_llama_state_get_data ::
    CLlamaContext -> -- ctx
    Ptr Word8 -> -- dst (buffer)
    CSize -> -- size
    IO CSize

-- | LLAMA_API size_t llama_state_set_data(struct llama_context * ctx, const uint8_t * src, size_t size);
foreign import ccall "llama_state_set_data"
  c_llama_state_set_data ::
    CLlamaContext -> -- ctx
    Ptr Word8 -> -- src (buffer)
    CSize -> -- size
    IO CSize

-- | LLAMA_API bool llama_state_load_file(struct llama_context * ctx, const char * path_session, llama_token * tokens_out, size_t n_token_capacity, size_t * n_token_count_out);
foreign import ccall "llama_state_load_file"
  c_llama_state_load_file ::
    CLlamaContext -> -- ctx
    CString -> -- path_session
    Ptr LlamaToken -> -- tokens_out
    CSize -> -- n_token_capacity
    Ptr CSize -> -- n_token_count_out
    IO CBool

-- | LLAMA_API bool llama_state_save_file(struct llama_context * ctx, const char * path_session, const llama_token * tokens, size_t n_token_count);
foreign import ccall "llama_state_save_file"
  c_llama_state_save_file ::
    CLlamaContext -> -- ctx
    CString -> -- path_session
    Ptr LlamaToken -> -- tokens
    CSize -> -- n_token_count
    IO CBool

-- | LLAMA_API size_t llama_state_seq_get_size(struct llama_context * ctx, llama_seq_id seq_id);
foreign import ccall "llama_state_seq_get_size"
  c_llama_state_seq_get_size ::
    CLlamaContext -> -- ctx
    LlamaSeqId -> -- seq_id
    IO CSize

-- | LLAMA_API size_t llama_state_seq_get_data(struct llama_context * ctx, uint8_t * dst, size_t size, llama_seq_id seq_id);
foreign import ccall "llama_state_seq_get_data"
  c_llama_state_seq_get_data ::
    CLlamaContext -> -- ctx
    Ptr Word8 -> -- dst (buffer)
    CSize -> -- size
    LlamaSeqId -> -- seq_id
    IO CSize

-- | LLAMA_API size_t llama_state_seq_set_data(struct llama_context * ctx, const uint8_t * src, size_t size, llama_seq_id dest_seq_id);
foreign import ccall "llama_state_seq_set_data"
  c_llama_state_seq_set_data ::
    CLlamaContext -> -- ctx
    Ptr Word8 -> -- src (buffer)
    CSize -> -- size
    LlamaSeqId -> -- dest_seq_id
    IO CSize

-- | LLAMA_API size_t llama_state_seq_save_file(struct llama_context * ctx, const char * filepath, llama_seq_id seq_id, const llama_token * tokens, size_t n_token_count);
foreign import ccall "llama_state_seq_save_file"
  c_llama_state_seq_save_file ::
    CLlamaContext -> -- ctx
    CString -> -- filepath
    LlamaSeqId -> -- seq_id
    Ptr LlamaToken -> -- tokens
    CSize -> -- n_token_count
    IO CSize

-- | LLAMA_API size_t llama_state_seq_load_file(struct llama_context * ctx, const char * filepath, llama_seq_id dest_seq_id, llama_token * tokens_out, size_t n_token_capacity, size_t * n_token_count_out);
foreign import ccall "llama_state_seq_load_file"
  c_llama_state_seq_load_file ::
    CLlamaContext -> -- ctx
    CString -> -- filepath
    LlamaSeqId -> -- dest_seq_id
    Ptr LlamaToken -> -- tokens_out
    CSize -> -- n_token_capacity
    Ptr CSize -> -- n_token_count_out
    IO CSize