###
# Modern Albufeira Prolog Interpreter
#
# Warranty & Liability
# To the extent permitted by applicable law and unless explicitly
# otherwise agreed upon, XLOG Technologies AG makes no warranties
# regarding the provided information. XLOG Technologies AG assumes
# no liability that any problems might be solved with the information
# provided by XLOG Technologies AG.
#
# Rights & License
# All industrial property rights regarding the information - copyright
# and patent rights in particular - are the sole property of XLOG
# Technologies AG. If the company was not the originator of some
# excerpts, XLOG Technologies AG has at least obtained the right to
# reproduce, change and translate the information.
#
# Reproduction is restricted to the whole unaltered document. Reproduction
# of the information is only allowed for non-commercial uses. Selling,
# giving away or letting of the execution of the library is prohibited.
# The library can be distributed as part of your applications and libraries
# for execution provided this comment remains unchanged.
#
# Restrictions
# Only to be distributed with programs that add significant and primary
# functionality to the library. Not to be distributed with additional
# software intended to replace any components of the library.
#
# Trademarks
# Jekejeke is a registered trademark of XLOG Technologies AG.
##

from nova.core import (exec_unify, exec_build,
     check_atom, check_sink, Source,
     Sink, set, make_check)


#######################################################################
# open_input_atom_stream/2                                            #
#######################################################################

###
# open_input_atom_stream(A, S):
# The built-in succeeds in S with a new input stream for the atom A.
##
def test_open_input_atom_stream(args):
    text = exec_build(args[0])
    check_atom(text)
    src = Source()
    src.buf = text
    return exec_unify(args[1], src)


#######################################################################
# open_output_atom_stream/1 and sys_output_atom_stream_get/2          #
#######################################################################

###
# open_output_atom_stream(S):
# The built-in succeeds in S with a new output stream.
##
def test_open_output_atom_stream(args):
    dst = Sink()
    dst.data = []
    dst.send = mem_send
    return exec_unify(args[0], dst)


def mem_send(data, buf):
    data.append(buf)
    return data


###
# sys_output_atom_stream_get(S, A):
# The built-in succeeds in A with the content of the output stream S.
##
def test_sys_output_atom_stream_get(args):
    writer = exec_build(args[0])
    check_sink(writer)
    res = "".join(writer.data)
    return exec_unify(args[1], res)


#######################################################################
# Aux Lib Init                                                        #
#######################################################################

def main():
    set("open_input_atom_stream", 2, make_check(test_open_input_atom_stream))
    set("open_output_atom_stream", 1, make_check(test_open_output_atom_stream))
    set("sys_output_atom_stream_get", 2, make_check(test_sys_output_atom_stream_get))

