mirror of
https://github.com/enso-org/enso.git
synced 2024-11-27 06:32:30 +03:00
Remove Array.new
and Array.copy
and move Vector functions to builtins. (#7147)
- Removed Array methods: `new`, `copy` and `new_[1234]`. - New builtins for `Vector.insert`, `Vector.remove` and `Vector.flatten`. - Replaced `Vector_Builder` use of `Array.copy` to a `Vector.Builder` approach.
This commit is contained in:
parent
4ccf3566ce
commit
4fbe7e3830
@ -5,7 +5,6 @@ import project.Data.List.List
|
|||||||
import project.Data.Ordering.Ordering
|
import project.Data.Ordering.Ordering
|
||||||
import project.Data.Sort_Direction.Sort_Direction
|
import project.Data.Sort_Direction.Sort_Direction
|
||||||
import project.Data.Pair.Pair
|
import project.Data.Pair.Pair
|
||||||
from project.Data.Range.Extensions import all
|
|
||||||
import project.Data.Range.Range
|
import project.Data.Range.Range
|
||||||
import project.Data.Text.Text
|
import project.Data.Text.Text
|
||||||
import project.Data.Vector.Vector
|
import project.Data.Vector.Vector
|
||||||
@ -15,113 +14,18 @@ import project.Errors.Common.Incomparable_Values
|
|||||||
import project.Errors.Common.Not_Found
|
import project.Errors.Common.Not_Found
|
||||||
import project.Errors.Common.Index_Out_Of_Bounds
|
import project.Errors.Common.Index_Out_Of_Bounds
|
||||||
import project.Errors.Problem_Behavior.Problem_Behavior
|
import project.Errors.Problem_Behavior.Problem_Behavior
|
||||||
|
import project.Errors.Unimplemented.Unimplemented
|
||||||
import project.Meta
|
import project.Meta
|
||||||
import project.Nothing.Nothing
|
import project.Nothing.Nothing
|
||||||
import project.Panic.Panic
|
import project.Panic.Panic
|
||||||
|
|
||||||
from project.Data.Boolean import Boolean, False
|
from project.Data.Boolean import Boolean, False
|
||||||
from project.Data.Index_Sub_Range import Index_Sub_Range
|
from project.Data.Index_Sub_Range import Index_Sub_Range
|
||||||
|
from project.Data.Range.Extensions import all
|
||||||
|
|
||||||
## The type of primitive mutable arrays.
|
## The type of primitive mutable arrays.
|
||||||
@Builtin_Type
|
@Builtin_Type
|
||||||
type Array
|
type Array
|
||||||
## PRIVATE
|
|
||||||
ADVANCED
|
|
||||||
Creates an array with length 0.
|
|
||||||
|
|
||||||
> Example
|
|
||||||
Create an empty array.
|
|
||||||
|
|
||||||
Array.empty
|
|
||||||
empty : Array
|
|
||||||
empty = @Builtin_Method "Array.empty"
|
|
||||||
|
|
||||||
## PRIVATE
|
|
||||||
ADVANCED
|
|
||||||
Creates a new array of length size, with all elements uninitialized.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
- size: The size of the array to create.
|
|
||||||
|
|
||||||
> Example
|
|
||||||
Create a new array of size 10.
|
|
||||||
|
|
||||||
Array.new 10
|
|
||||||
new : Integer -> Array
|
|
||||||
new size = @Builtin_Method "Array.new"
|
|
||||||
|
|
||||||
## PRIVATE
|
|
||||||
|
|
||||||
Create an array with one element provided.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
- item_1: The one element in the array.
|
|
||||||
new_1 : Any -> Array
|
|
||||||
new_1 item_1 = @Builtin_Method "Array.new_1"
|
|
||||||
|
|
||||||
## PRIVATE
|
|
||||||
|
|
||||||
Create an array with two elements provided.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
- item_1: The first element.
|
|
||||||
- item_2: The second element.
|
|
||||||
new_2 : Any -> Any -> Array
|
|
||||||
new_2 item_1 item_2 = @Builtin_Method "Array.new_2"
|
|
||||||
|
|
||||||
## PRIVATE
|
|
||||||
|
|
||||||
Create an array with three elements provided.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
- item_1: The first element.
|
|
||||||
- item_2: The second element.
|
|
||||||
- item_3: The third element.
|
|
||||||
new_3 : Any -> Any -> Any -> Array
|
|
||||||
new_3 item_1 item_2 item_3 = @Builtin_Method "Array.new_3"
|
|
||||||
|
|
||||||
## PRIVATE
|
|
||||||
|
|
||||||
Create an array with four elements provided.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
- item_1: The first element.
|
|
||||||
- item_2: The second element.
|
|
||||||
- item_3: The third element.
|
|
||||||
- item_4: The fourth element.
|
|
||||||
new_4 : Any -> Any -> Any -> Any -> Array
|
|
||||||
new_4 item_1 item_2 item_3 item_4 = @Builtin_Method "Array.new_4"
|
|
||||||
|
|
||||||
## PRIVATE
|
|
||||||
Copies from the source array, beginning at the specified position, to the
|
|
||||||
specified position in the destination array.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
- src: The source array.
|
|
||||||
- source_index: The start position in the src array.
|
|
||||||
- dest: The destination array.
|
|
||||||
- dest_index: The start position in the that array.
|
|
||||||
|
|
||||||
A subsequence of array elements are copied from the src array to the
|
|
||||||
dest array. The number of components copied is equal to count. The
|
|
||||||
components at positions source_index through source_index + count - 1
|
|
||||||
in the src array are copied into positions dest_index through
|
|
||||||
dest_index + count - 1, respectively, of the destination array.
|
|
||||||
|
|
||||||
If the src and dest arguments refer to the same array, then the copy
|
|
||||||
is performed as if the components at positions source_index through
|
|
||||||
source_index + count - 1 are first copied to a temporary array with
|
|
||||||
length count, and then the contents of the temporary array are copied
|
|
||||||
into positions dest_index through dest_index + count - 1 of the
|
|
||||||
destination array.
|
|
||||||
|
|
||||||
> Example
|
|
||||||
Copying elements from one array to another.
|
|
||||||
|
|
||||||
Array.copy [1,2,3].to_array 0 (Vector.fill 3 0).to_array 0 3
|
|
||||||
copy : Array -> Integer -> Array -> Integer -> Integer -> Nothing
|
|
||||||
copy src source_index dest dest_index count = @Builtin_Method "Array.copy"
|
|
||||||
|
|
||||||
## Gets an element from the array at a specified index (0-based).
|
## Gets an element from the array at a specified index (0-based).
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
@ -593,6 +497,17 @@ type Array
|
|||||||
map_with_index : (Integer -> Any -> Any) -> Vector Any
|
map_with_index : (Integer -> Any -> Any) -> Vector Any
|
||||||
map_with_index self function = Vector.map_with_index self function
|
map_with_index self function = Vector.map_with_index self function
|
||||||
|
|
||||||
|
## Creates a new array with the skipping elements until `start` and then
|
||||||
|
continuing until `end` index.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
- start: The index of the first element to include.
|
||||||
|
- end: The index to stop slicing at.
|
||||||
|
|
||||||
|
> Example
|
||||||
|
Remove the first 2 elements then continue until index 5 from the array.
|
||||||
|
|
||||||
|
[1, 2, 3, 4, 5, 6, 7, 8].to_array.slice 2 5 == [3, 4, 5].to_array
|
||||||
slice : Integer -> Integer -> Vector Any
|
slice : Integer -> Integer -> Vector Any
|
||||||
slice self start end = Vector.slice self start end
|
slice self start end = Vector.slice self start end
|
||||||
|
|
||||||
|
@ -233,7 +233,7 @@ type Filter_Condition
|
|||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
Creates a Single_Choice Widget for delimiters.
|
Creates a Single_Choice Widget for delimiters.
|
||||||
default_widget : Boolean -> Boolean -> Boolean -> Widget
|
default_widget : Boolean -> Boolean -> Boolean -> Boolean -> Widget
|
||||||
default_widget include_comparable=True include_text=True include_boolean=True include_nullable=True =
|
default_widget include_comparable=True include_text=True include_boolean=True include_nullable=True =
|
||||||
options_builder = Vector.new_builder
|
options_builder = Vector.new_builder
|
||||||
if include_comparable then
|
if include_comparable then
|
||||||
|
@ -56,22 +56,22 @@ fit_least_squares : Vector -> Vector -> Model -> Fitted_Model ! Illegal_Argument
|
|||||||
fit_least_squares known_xs known_ys model=Model.Linear =
|
fit_least_squares known_xs known_ys model=Model.Linear =
|
||||||
Illegal_Argument.handle_java_exception <| Fit_Error.handle_java_exception <| case model of
|
Illegal_Argument.handle_java_exception <| Fit_Error.handle_java_exception <| case model of
|
||||||
Model.Linear intercept ->
|
Model.Linear intercept ->
|
||||||
fitted = if intercept.is_nothing then Regression.fit_linear known_xs.to_array known_ys.to_array else
|
fitted = if intercept.is_nothing then Regression.fit_linear known_xs known_ys else
|
||||||
Regression.fit_linear known_xs.to_array known_ys.to_array intercept
|
Regression.fit_linear known_xs known_ys intercept
|
||||||
Fitted_Model.Linear fitted.slope fitted.intercept fitted.rSquared
|
Fitted_Model.Linear fitted.slope fitted.intercept fitted.rSquared
|
||||||
Model.Exponential intercept ->
|
Model.Exponential intercept ->
|
||||||
log_ys = Model.ln_series known_ys "Y-values"
|
log_ys = Model.ln_series known_ys "Y-values"
|
||||||
fitted = if intercept.is_nothing then Regression.fit_linear known_xs.to_array log_ys.to_array else
|
fitted = if intercept.is_nothing then Regression.fit_linear known_xs log_ys else
|
||||||
Regression.fit_linear known_xs.to_array log_ys.to_array intercept.ln
|
Regression.fit_linear known_xs log_ys intercept.ln
|
||||||
Model.fitted_model_with_r_squared Fitted_Model.Exponential fitted.intercept.exp fitted.slope known_xs known_ys
|
Model.fitted_model_with_r_squared Fitted_Model.Exponential fitted.intercept.exp fitted.slope known_xs known_ys
|
||||||
Model.Logarithmic ->
|
Model.Logarithmic ->
|
||||||
log_xs = Model.ln_series known_xs "X-values"
|
log_xs = Model.ln_series known_xs "X-values"
|
||||||
fitted = Regression.fit_linear log_xs.to_array known_ys.to_array
|
fitted = Regression.fit_linear log_xs known_ys
|
||||||
Model.fitted_model_with_r_squared Fitted_Model.Logarithmic fitted.slope fitted.intercept known_xs known_ys
|
Model.fitted_model_with_r_squared Fitted_Model.Logarithmic fitted.slope fitted.intercept known_xs known_ys
|
||||||
Model.Power ->
|
Model.Power ->
|
||||||
log_xs = Model.ln_series known_xs "X-values"
|
log_xs = Model.ln_series known_xs "X-values"
|
||||||
log_ys = Model.ln_series known_ys "Y-values"
|
log_ys = Model.ln_series known_ys "Y-values"
|
||||||
fitted = Regression.fit_linear log_xs.to_array log_ys.to_array
|
fitted = Regression.fit_linear log_xs log_ys
|
||||||
Model.fitted_model_with_r_squared Fitted_Model.Power fitted.intercept.exp fitted.slope known_xs known_ys
|
Model.fitted_model_with_r_squared Fitted_Model.Power fitted.intercept.exp fitted.slope known_xs known_ys
|
||||||
_ -> Error.throw (Illegal_Argument.Error "Unsupported model.")
|
_ -> Error.throw (Illegal_Argument.Error "Unsupported model.")
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ type Rank_Method
|
|||||||
Error.throw (Incomparable_Values.Error exc.payload.getLeftOperand exc.payload.getRightOperand)
|
Error.throw (Incomparable_Values.Error exc.payload.getLeftOperand exc.payload.getRightOperand)
|
||||||
|
|
||||||
handle_cmp_exc <| handle_nullpointer <|
|
handle_cmp_exc <| handle_nullpointer <|
|
||||||
java_ranks = Rank.rank input.to_array java_method
|
java_ranks = Rank.rank input java_method
|
||||||
Vector.from_polyglot_array java_ranks
|
Vector.from_polyglot_array java_ranks
|
||||||
|
|
||||||
type Statistic
|
type Statistic
|
||||||
@ -302,19 +302,19 @@ wrap_java_call ~function =
|
|||||||
Given two series, get a computed CorrelationStatistics object
|
Given two series, get a computed CorrelationStatistics object
|
||||||
calculate_correlation_statistics : Vector -> Vector -> CorrelationStatistics
|
calculate_correlation_statistics : Vector -> Vector -> CorrelationStatistics
|
||||||
calculate_correlation_statistics x_data y_data =
|
calculate_correlation_statistics x_data y_data =
|
||||||
wrap_java_call <| CorrelationStatistics.compute x_data.to_array y_data.to_array
|
wrap_java_call <| CorrelationStatistics.compute x_data y_data
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
Given two series, get a compute the Spearman Rank correlation
|
Given two series, get a compute the Spearman Rank correlation
|
||||||
calculate_spearman_rank : Vector -> Vector -> Decimal
|
calculate_spearman_rank : Vector -> Vector -> Decimal
|
||||||
calculate_spearman_rank x_data y_data =
|
calculate_spearman_rank x_data y_data =
|
||||||
wrap_java_call <| CorrelationStatistics.spearmanRankCorrelation x_data.to_array y_data.to_array
|
wrap_java_call <| CorrelationStatistics.spearmanRankCorrelation x_data y_data
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
Given a set of series get CorrelationStatistics objects
|
Given a set of series get CorrelationStatistics objects
|
||||||
calculate_correlation_statistics_matrix : Vector Vector -> Vector CorrelationStatistics
|
calculate_correlation_statistics_matrix : Vector Vector -> Vector CorrelationStatistics
|
||||||
calculate_correlation_statistics_matrix data =
|
calculate_correlation_statistics_matrix data =
|
||||||
data_array = Vector.new data.length i->(data.at i).to_array . to_array
|
data_array = Vector.new data.length i->(data.at i).to_array
|
||||||
stats_array = wrap_java_call <| CorrelationStatistics.computeMatrix data_array
|
stats_array = wrap_java_call <| CorrelationStatistics.computeMatrix data_array
|
||||||
Vector.new stats_array.length i->(Vector.from_polyglot_array (stats_array.at i))
|
Vector.new stats_array.length i->(Vector.from_polyglot_array (stats_array.at i))
|
||||||
|
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
## Methods for operating on `Text` in Enso.
|
## Methods for operating on `Text` in Enso.
|
||||||
|
|
||||||
import project.Any.Any
|
import project.Any.Any
|
||||||
import project.Data.Array.Array
|
|
||||||
import project.Data.Index_Sub_Range.Index_Sub_Range
|
import project.Data.Index_Sub_Range.Index_Sub_Range
|
||||||
import project.Data.Locale.Locale
|
import project.Data.Locale.Locale
|
||||||
from project.Data.Range.Extensions import all
|
|
||||||
import project.Data.Range.Range
|
import project.Data.Range.Range
|
||||||
import project.Data.Text.Case.Case
|
import project.Data.Text.Case.Case
|
||||||
import project.Data.Text.Case_Sensitivity.Case_Sensitivity
|
import project.Data.Text.Case_Sensitivity.Case_Sensitivity
|
||||||
@ -38,6 +36,7 @@ import project.Nothing.Nothing
|
|||||||
from project.Data.Boolean import Boolean, True, False
|
from project.Data.Boolean import Boolean, True, False
|
||||||
from project.Data.Json import Json, Invalid_JSON, JS_Object
|
from project.Data.Json import Json, Invalid_JSON, JS_Object
|
||||||
from project.Data.Numbers import Decimal, Integer, Number, Number_Parse_Error
|
from project.Data.Numbers import Decimal, Integer, Number, Number_Parse_Error
|
||||||
|
from project.Data.Range.Extensions import all
|
||||||
|
|
||||||
from project.Widget_Helpers import make_delimiter_selector, make_date_format_selector, make_date_time_format_selector, make_time_format_selector
|
from project.Widget_Helpers import make_delimiter_selector, make_date_format_selector, make_date_time_format_selector, make_time_format_selector
|
||||||
|
|
||||||
@ -473,8 +472,8 @@ Text.replace self term replacement case_sensitivity=Case_Sensitivity.Sensitive o
|
|||||||
case use_regex of
|
case use_regex of
|
||||||
False -> if term.is_empty then self else
|
False -> if term.is_empty then self else
|
||||||
array_from_single_result result = case result of
|
array_from_single_result result = case result of
|
||||||
Nothing -> Array.empty
|
Nothing -> []
|
||||||
_ -> Array.new_1 result
|
_ -> [result]
|
||||||
spans_array = case case_sensitivity of
|
spans_array = case case_sensitivity of
|
||||||
Case_Sensitivity.Sensitive -> case only_first of
|
Case_Sensitivity.Sensitive -> case only_first of
|
||||||
False -> Text_Utils.span_of_all self term
|
False -> Text_Utils.span_of_all self term
|
||||||
@ -673,7 +672,7 @@ Text.bytes self encoding on_problems=Problem_Behavior.Report_Warning =
|
|||||||
@encoding Encoding.default_widget
|
@encoding Encoding.default_widget
|
||||||
Text.from_bytes : Vector Integer -> Encoding -> Problem_Behavior -> Text
|
Text.from_bytes : Vector Integer -> Encoding -> Problem_Behavior -> Text
|
||||||
Text.from_bytes bytes encoding on_problems=Problem_Behavior.Report_Error =
|
Text.from_bytes bytes encoding on_problems=Problem_Behavior.Report_Error =
|
||||||
result = Encoding_Utils.from_bytes bytes.to_array (encoding . to_java_charset)
|
result = Encoding_Utils.from_bytes bytes (encoding . to_java_charset)
|
||||||
if result.warnings.is_nothing then result.result else
|
if result.warnings.is_nothing then result.result else
|
||||||
on_problems.attach_problems_after result.result [Encoding_Error.Error result.warnings]
|
on_problems.attach_problems_after result.result [Encoding_Error.Error result.warnings]
|
||||||
|
|
||||||
@ -736,7 +735,7 @@ Text.char_vector self = Vector.from_polyglot_array (Text_Utils.get_chars self)
|
|||||||
This is useful for low-level operations, such as binary data encoding and
|
This is useful for low-level operations, such as binary data encoding and
|
||||||
decoding.
|
decoding.
|
||||||
Text.from_char_vector : Vector Integer -> Text
|
Text.from_char_vector : Vector Integer -> Text
|
||||||
Text.from_char_vector chars = Text_Utils.from_chars chars.to_array
|
Text.from_char_vector chars = Text_Utils.from_chars chars
|
||||||
|
|
||||||
## Returns a vector containing integers representing the Unicode codepoints of
|
## Returns a vector containing integers representing the Unicode codepoints of
|
||||||
the input text.
|
the input text.
|
||||||
@ -761,7 +760,7 @@ Text.codepoints self = Vector.from_polyglot_array (Text_Utils.get_codepoints sel
|
|||||||
Converting a vector of codepoints back into a text.
|
Converting a vector of codepoints back into a text.
|
||||||
Text.from_codepoints [129318, 127996, 8205, 9794, 65039]
|
Text.from_codepoints [129318, 127996, 8205, 9794, 65039]
|
||||||
Text.from_codepoints : Vector Integer -> Text
|
Text.from_codepoints : Vector Integer -> Text
|
||||||
Text.from_codepoints codepoints = Text_Utils.from_codepoints codepoints.to_array
|
Text.from_codepoints codepoints = Text_Utils.from_codepoints codepoints
|
||||||
|
|
||||||
## ALIAS Check Prefix
|
## ALIAS Check Prefix
|
||||||
|
|
||||||
@ -1301,7 +1300,7 @@ Text.locate_all self term="" case_sensitivity=Case_Sensitivity.Sensitive = if te
|
|||||||
Case_Sensitivity.Default -> self.locate term Case_Sensitivity.Sensitive
|
Case_Sensitivity.Default -> self.locate term Case_Sensitivity.Sensitive
|
||||||
Case_Sensitivity.Sensitive ->
|
Case_Sensitivity.Sensitive ->
|
||||||
codepoint_spans = Vector.from_polyglot_array <| Text_Utils.span_of_all self term
|
codepoint_spans = Vector.from_polyglot_array <| Text_Utils.span_of_all self term
|
||||||
grahpeme_ixes = Vector.from_polyglot_array <| Text_Utils.utf16_indices_to_grapheme_indices self (codepoint_spans.map .codeunit_start).to_array
|
grahpeme_ixes = Vector.from_polyglot_array <| Text_Utils.utf16_indices_to_grapheme_indices self (codepoint_spans.map .codeunit_start)
|
||||||
## While the codepoint_spans may have different code unit lengths
|
## While the codepoint_spans may have different code unit lengths
|
||||||
from our term, the `length` counted in grapheme clusters is
|
from our term, the `length` counted in grapheme clusters is
|
||||||
guaranteed to be the same.
|
guaranteed to be the same.
|
||||||
|
@ -161,7 +161,7 @@ type Utf_16_Span
|
|||||||
grapheme_ix = Text_Utils.utf16_index_to_grapheme_index self.parent self.start
|
grapheme_ix = Text_Utils.utf16_index_to_grapheme_index self.parent self.start
|
||||||
Span.Value (grapheme_ix.up_to grapheme_ix) self.parent
|
Span.Value (grapheme_ix.up_to grapheme_ix) self.parent
|
||||||
False ->
|
False ->
|
||||||
grapheme_ixes = Text_Utils.utf16_indices_to_grapheme_indices self.parent [self.start, self.end - 1].to_array
|
grapheme_ixes = Text_Utils.utf16_indices_to_grapheme_indices self.parent [self.start, self.end - 1]
|
||||||
grapheme_first = grapheme_ixes.at 0
|
grapheme_first = grapheme_ixes.at 0
|
||||||
grapheme_last = grapheme_ixes.at 1
|
grapheme_last = grapheme_ixes.at 1
|
||||||
## We find the grapheme index of the last code unit actually contained within our span and set the
|
## We find the grapheme index of the last code unit actually contained within our span and set the
|
||||||
|
@ -24,14 +24,11 @@ import project.Panic.Panic
|
|||||||
import project.Random
|
import project.Random
|
||||||
import project.Warning.Warning
|
import project.Warning.Warning
|
||||||
|
|
||||||
from project.Data.Range.Extensions import all
|
|
||||||
|
|
||||||
## We have to import also conversion methods, therefore, we import all from the Ordering
|
|
||||||
module
|
|
||||||
from project.Data.Ordering import all
|
|
||||||
from project.Data.Boolean import Boolean, True, False
|
from project.Data.Boolean import Boolean, True, False
|
||||||
from project.Data.Index_Sub_Range import Index_Sub_Range, take_helper, drop_helper
|
|
||||||
from project.Data.Filter_Condition import unify_condition_or_predicate, unify_condition_predicate_or_element
|
from project.Data.Filter_Condition import unify_condition_or_predicate, unify_condition_predicate_or_element
|
||||||
|
from project.Data.Index_Sub_Range import Index_Sub_Range, take_helper, drop_helper
|
||||||
|
from project.Data.Ordering import all
|
||||||
|
from project.Data.Range.Extensions import all
|
||||||
|
|
||||||
polyglot java import java.lang.IndexOutOfBoundsException
|
polyglot java import java.lang.IndexOutOfBoundsException
|
||||||
polyglot java import org.enso.base.Array_Builder
|
polyglot java import org.enso.base.Array_Builder
|
||||||
@ -568,13 +565,7 @@ type Vector a
|
|||||||
|
|
||||||
[[1, 2, 3], [4, 10], [], [0], [0]] . flatten == [1, 2, 3, 4, 10, 0, 0]
|
[[1, 2, 3], [4, 10], [], [0], [0]] . flatten == [1, 2, 3, 4, 10, 0, 0]
|
||||||
flatten : Vector Any
|
flatten : Vector Any
|
||||||
flatten self =
|
flatten self = @Builtin_Method "Vector.flatten"
|
||||||
length = self.fold 0 acc-> elem-> acc + elem.length
|
|
||||||
arr = Array.new length
|
|
||||||
self.fold 0 i-> vec->
|
|
||||||
Array.copy vec.to_array 0 arr i vec.length
|
|
||||||
i + vec.length
|
|
||||||
Vector.from_polyglot_array arr
|
|
||||||
|
|
||||||
## Applies a function to each element of the vector, returning the `Vector`
|
## Applies a function to each element of the vector, returning the `Vector`
|
||||||
of results.
|
of results.
|
||||||
@ -691,13 +682,7 @@ type Vector a
|
|||||||
[1] + [2]
|
[1] + [2]
|
||||||
+ : Vector Any -> Vector Any
|
+ : Vector Any -> Vector Any
|
||||||
+ self that = case that of
|
+ self that = case that of
|
||||||
_ : Vector ->
|
_ : Vector -> Vector.insert_builtin self self.length that
|
||||||
self_len = self.length
|
|
||||||
that_len = that.length
|
|
||||||
arr = Array.new (self_len + that_len)
|
|
||||||
Array.copy self.to_array 0 arr 0 self_len
|
|
||||||
Array.copy that.to_array 0 arr self_len that_len
|
|
||||||
Vector.from_polyglot_array arr
|
|
||||||
_ : Array -> self + Vector.from_polyglot_array that
|
_ : Array -> self + Vector.from_polyglot_array that
|
||||||
_ -> Error.throw (Type_Error.Error Vector that "that")
|
_ -> Error.throw (Type_Error.Error Vector that "that")
|
||||||
|
|
||||||
@ -723,11 +708,10 @@ type Vector a
|
|||||||
if used_index < 0 || used_index > self_len then Error.throw (Index_Out_Of_Bounds.Error at self_len+1) else
|
if used_index < 0 || used_index > self_len then Error.throw (Index_Out_Of_Bounds.Error at self_len+1) else
|
||||||
if used_index == self_len then self + [item] else
|
if used_index == self_len then self + [item] else
|
||||||
if used_index == 0 then [item] + self else
|
if used_index == 0 then [item] + self else
|
||||||
arr = Array.new (self_len + 1)
|
Vector.insert_builtin self used_index [item]
|
||||||
Array.copy self.to_array 0 arr 0 used_index
|
|
||||||
Array.copy [item].to_array 0 arr used_index 1
|
## PRIVATE
|
||||||
Array.copy self.to_array used_index arr (used_index + 1) (self_len - used_index)
|
insert_builtin vec at values = @Builtin_Method("Vector.insert_builtin")
|
||||||
Vector.from_polyglot_array arr
|
|
||||||
|
|
||||||
## Removes the item at the given index from the vector.
|
## Removes the item at the given index from the vector.
|
||||||
|
|
||||||
@ -740,10 +724,10 @@ type Vector a
|
|||||||
self_len = self.length
|
self_len = self.length
|
||||||
used_index = if at < 0 then self_len + at else at
|
used_index = if at < 0 then self_len + at else at
|
||||||
if used_index >= self_len || used_index < 0 then Error.throw (Index_Out_Of_Bounds.Error at self_len) else
|
if used_index >= self_len || used_index < 0 then Error.throw (Index_Out_Of_Bounds.Error at self_len) else
|
||||||
arr = Array.new (self_len - 1)
|
Vector.remove_builtin self used_index
|
||||||
Array.copy self.to_array 0 arr 0 used_index
|
|
||||||
Array.copy self.to_array (used_index + 1) arr used_index (self_len - used_index - 1)
|
## PRIVATE
|
||||||
Vector.from_polyglot_array arr
|
remove_builtin vec at = @Builtin_Method "Vector.remove_builtin"
|
||||||
|
|
||||||
## When `self` is a vector of text values, concatenates all the values by
|
## When `self` is a vector of text values, concatenates all the values by
|
||||||
interspersing them with `separator`.
|
interspersing them with `separator`.
|
||||||
@ -763,8 +747,7 @@ type Vector a
|
|||||||
if self.length == 1 then prefix + self.at 0 + suffix else
|
if self.length == 1 then prefix + self.at 0 + suffix else
|
||||||
prefix + self.at 0 + (1.up_to self.length . fold "" acc-> i-> acc + separator + self.at i) + suffix
|
prefix + self.at 0 + (1.up_to self.length . fold "" acc-> i-> acc + separator + self.at i) + suffix
|
||||||
|
|
||||||
## PRIVATE
|
## Creates a new vector with the skipping elements until `start` and then
|
||||||
Creates a new vector with the skipping elements until `start` and then
|
|
||||||
continuing until `end` index.
|
continuing until `end` index.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
@ -1113,7 +1096,7 @@ type Builder
|
|||||||
## This workaround is needed because
|
## This workaround is needed because
|
||||||
`self.java_builder.addAll subrange.to_array` fails with
|
`self.java_builder.addAll subrange.to_array` fails with
|
||||||
`Unsupported argument types: [Array]`.
|
`Unsupported argument types: [Array]`.
|
||||||
append_result = self.java_builder.appendTo subrange.to_array
|
append_result = self.java_builder.appendTo subrange
|
||||||
append_result.if_not_error self
|
append_result.if_not_error self
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
|
@ -136,7 +136,7 @@ type Constructor
|
|||||||
new : Vector -> Any
|
new : Vector -> Any
|
||||||
new self fields =
|
new self fields =
|
||||||
ctor = self.value ...
|
ctor = self.value ...
|
||||||
new_atom ctor fields.to_array
|
new_atom ctor fields
|
||||||
|
|
||||||
## ADVANCED
|
## ADVANCED
|
||||||
Returns the type that this constructor is a part of.
|
Returns the type that this constructor is a part of.
|
||||||
|
@ -451,7 +451,7 @@ type HTTP
|
|||||||
add_urlencoded form
|
add_urlencoded form
|
||||||
Request_Body.Bytes bytes ->
|
Request_Body.Bytes bytes ->
|
||||||
builder.header Header.application_octet_stream.name Header.application_octet_stream.value
|
builder.header Header.application_octet_stream.name Header.application_octet_stream.value
|
||||||
Pair.new req (body_publishers.ofByteArray bytes.to_array)
|
Pair.new req (body_publishers.ofByteArray bytes)
|
||||||
# method
|
# method
|
||||||
req_http_method = req.method.to_http_method_name
|
req_http_method = req.method.to_http_method_name
|
||||||
case req_with_body of
|
case req_with_body of
|
||||||
|
@ -76,7 +76,7 @@ type Random_Number_Generator
|
|||||||
returns a random permutation of the input vector.
|
returns a random permutation of the input vector.
|
||||||
sample : Vector Any -> Integer -> Random_Number_Generator -> Vector Any
|
sample : Vector Any -> Integer -> Random_Number_Generator -> Vector Any
|
||||||
sample vector k rng =
|
sample vector k rng =
|
||||||
new_array = Random_Utils.sample vector.to_array k rng.java_random
|
new_array = Random_Utils.sample vector k rng.java_random
|
||||||
Vector.from_polyglot_array new_array
|
Vector.from_polyglot_array new_array
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
|
@ -149,7 +149,7 @@ type File
|
|||||||
new_output_stream file open_options =
|
new_output_stream file open_options =
|
||||||
opts = open_options . map (_.to_java) . to_array
|
opts = open_options . map (_.to_java) . to_array
|
||||||
stream = File_Error.handle_java_exceptions file <|
|
stream = File_Error.handle_java_exceptions file <|
|
||||||
file.output_stream_builtin opts
|
file.output_stream_builtin opts.to_array
|
||||||
## We re-wrap the File Not Found error to return the parent directory
|
## We re-wrap the File Not Found error to return the parent directory
|
||||||
instead of the file itself - because the file that is being written
|
instead of the file itself - because the file that is being written
|
||||||
may not exist and it will not be an error, it is the parent directory
|
may not exist and it will not be an error, it is the parent directory
|
||||||
@ -330,7 +330,7 @@ type File
|
|||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
Internal method to join two path segments together.
|
Internal method to join two path segments together.
|
||||||
resolve : File
|
resolve : Text -> File
|
||||||
resolve self subpath = @Builtin_Method "File.resolve"
|
resolve self subpath = @Builtin_Method "File.resolve"
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
@ -565,9 +565,9 @@ type File
|
|||||||
if Context.Output.is_enabled.not then Error.throw (Forbidden_Operation.Error "File copying is forbidden as the Output context is disabled.") else
|
if Context.Output.is_enabled.not then Error.throw (Forbidden_Operation.Error "File copying is forbidden as the Output context is disabled.") else
|
||||||
File_Error.handle_java_exceptions self <| case replace_existing of
|
File_Error.handle_java_exceptions self <| case replace_existing of
|
||||||
True ->
|
True ->
|
||||||
copy_options = [StandardCopyOption.REPLACE_EXISTING].to_array
|
copy_options = [StandardCopyOption.REPLACE_EXISTING]
|
||||||
self.copy_builtin destination copy_options
|
self.copy_builtin destination copy_options.to_array
|
||||||
False -> self.copy_builtin destination Array.empty
|
False -> self.copy_builtin destination [].to_array
|
||||||
|
|
||||||
## Moves the file to the specified destination.
|
## Moves the file to the specified destination.
|
||||||
|
|
||||||
@ -580,9 +580,9 @@ type File
|
|||||||
if Context.Output.is_enabled.not then Error.throw (Forbidden_Operation.Error "File moving is forbidden as the Output context is disabled.") else
|
if Context.Output.is_enabled.not then Error.throw (Forbidden_Operation.Error "File moving is forbidden as the Output context is disabled.") else
|
||||||
File_Error.handle_java_exceptions self <| case replace_existing of
|
File_Error.handle_java_exceptions self <| case replace_existing of
|
||||||
True ->
|
True ->
|
||||||
copy_options = [StandardCopyOption.REPLACE_EXISTING].to_array
|
copy_options = [StandardCopyOption.REPLACE_EXISTING]
|
||||||
self.move_builtin destination copy_options
|
self.move_builtin destination copy_options.to_array
|
||||||
False -> self.move_builtin destination Array.empty
|
False -> self.move_builtin destination [].to_array
|
||||||
|
|
||||||
## Deletes the file if it exists on disk.
|
## Deletes the file if it exists on disk.
|
||||||
|
|
||||||
@ -612,7 +612,7 @@ type File
|
|||||||
new_input_stream self open_options =
|
new_input_stream self open_options =
|
||||||
if self.is_directory then Error.throw (File_Error.IO_Error self "File '"+self.path+"' is a directory") else
|
if self.is_directory then Error.throw (File_Error.IO_Error self "File '"+self.path+"' is a directory") else
|
||||||
opts = open_options . map (_.to_java) . to_array
|
opts = open_options . map (_.to_java) . to_array
|
||||||
stream = File_Error.handle_java_exceptions self (self.input_stream opts)
|
stream = File_Error.handle_java_exceptions self (self.input_stream opts.to_array)
|
||||||
resource = Managed_Resource.register stream close_stream
|
resource = Managed_Resource.register stream close_stream
|
||||||
Input_Stream.Value self resource
|
Input_Stream.Value self resource
|
||||||
|
|
||||||
@ -759,7 +759,7 @@ type Output_Stream
|
|||||||
write_bytes : Vector File_Access -> Nothing ! File_Error
|
write_bytes : Vector File_Access -> Nothing ! File_Error
|
||||||
write_bytes self contents = self.stream_resource . with java_stream->
|
write_bytes self contents = self.stream_resource . with java_stream->
|
||||||
File_Error.handle_java_exceptions self.file <|
|
File_Error.handle_java_exceptions self.file <|
|
||||||
java_stream.write contents.to_array
|
java_stream.write contents
|
||||||
java_stream.flush
|
java_stream.flush
|
||||||
Nothing
|
Nothing
|
||||||
|
|
||||||
@ -810,7 +810,7 @@ type Output_Stream
|
|||||||
the `?` character.
|
the `?` character.
|
||||||
replacement_sequence = Encoding_Utils.INVALID_CHARACTER.bytes encoding on_problems=Problem_Behavior.Ignore
|
replacement_sequence = Encoding_Utils.INVALID_CHARACTER.bytes encoding on_problems=Problem_Behavior.Ignore
|
||||||
java_charset = encoding.to_java_charset
|
java_charset = encoding.to_java_charset
|
||||||
results = Encoding_Utils.with_stream_encoder java_stream java_charset replacement_sequence.to_array action
|
results = Encoding_Utils.with_stream_encoder java_stream java_charset replacement_sequence action
|
||||||
problems = Vector.from_polyglot_array results.problems . map Encoding_Error.Error
|
problems = Vector.from_polyglot_array results.problems . map Encoding_Error.Error
|
||||||
on_problems.attach_problems_after results.result problems
|
on_problems.attach_problems_after results.result problems
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ Vector.write_bytes : (File|Text) -> Existing_File_Behavior -> File ! Illegal_Arg
|
|||||||
Vector.write_bytes self path on_existing_file=Existing_File_Behavior.Backup =
|
Vector.write_bytes self path on_existing_file=Existing_File_Behavior.Backup =
|
||||||
Panic.catch Unsupported_Argument_Types handler=(_ -> Error.throw (Illegal_Argument.Error "Only Vectors consisting of bytes (integers in the range from -128 to 127) are supported by the `write_bytes` method.")) <|
|
Panic.catch Unsupported_Argument_Types handler=(_ -> Error.throw (Illegal_Argument.Error "Only Vectors consisting of bytes (integers in the range from -128 to 127) are supported by the `write_bytes` method.")) <|
|
||||||
## Convert to a byte array before writing - and fail early if there is any problem.
|
## Convert to a byte array before writing - and fail early if there is any problem.
|
||||||
byte_array = Array_Builder.ensureByteArray self.to_array
|
byte_array = Array_Builder.ensureByteArray self
|
||||||
|
|
||||||
file = File.new path
|
file = File.new path
|
||||||
r = on_existing_file.write file stream->
|
r = on_existing_file.write file stream->
|
||||||
|
@ -71,7 +71,7 @@ type Process_Builder
|
|||||||
with_args.create
|
with_args.create
|
||||||
create : Process_Result
|
create : Process_Result
|
||||||
create self =
|
create self =
|
||||||
result = System.create_process self.command self.arguments.to_array self.stdin redirect_in=(self.stdin == False) redirect_out=False redirect_err=False
|
result = System.create_process self.command self.arguments self.stdin redirect_in=(self.stdin == False) redirect_out=False redirect_err=False
|
||||||
exit_code = Exit_Code.from_number result.exit_code
|
exit_code = Exit_Code.from_number result.exit_code
|
||||||
Process_Result.Value exit_code result.stdout result.stderr
|
Process_Result.Value exit_code result.stdout result.stderr
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ type Warning
|
|||||||
- value: the value to which warnings should be set to.
|
- value: the value to which warnings should be set to.
|
||||||
- warnings: vector of warnings to set to the value.
|
- warnings: vector of warnings to set to the value.
|
||||||
set : Any -> Vector Warning -> Any
|
set : Any -> Vector Warning -> Any
|
||||||
set value warnings = set_array value warnings.to_array
|
set value warnings = set_array value warnings
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
ADVANCED
|
ADVANCED
|
||||||
|
@ -644,7 +644,7 @@ type Column
|
|||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
Round a float-like column using the backend's builtin ROUND function.
|
Round a float-like column using the backend's builtin ROUND function.
|
||||||
round_builtin : Integer -> Boolean -> Column
|
round_builtin : Integer -> Column
|
||||||
round_builtin self decimal_places =
|
round_builtin self decimal_places =
|
||||||
new_name = self.naming_helpers.function_name "round" [self]
|
new_name = self.naming_helpers.function_name "round" [self]
|
||||||
case decimal_places == 0 of
|
case decimal_places == 0 of
|
||||||
|
@ -40,7 +40,7 @@ type Image
|
|||||||
Image.from_vector [0, 0, 0, 0, 0, 0] rows=2 channels=1
|
Image.from_vector [0, 0, 0, 0, 0, 0] rows=2 channels=1
|
||||||
from_vector : Vector -> Integer -> Integer -> Image
|
from_vector : Vector -> Integer -> Integer -> Image
|
||||||
from_vector values rows=1 channels=1 =
|
from_vector values rows=1 channels=1 =
|
||||||
Image.Value (Java_Image.from_vector values.to_array rows channels)
|
Image.Value (Java_Image.from_vector values rows channels)
|
||||||
|
|
||||||
## UNSTABLE
|
## UNSTABLE
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ type Image
|
|||||||
write_flags = case flags of
|
write_flags = case flags of
|
||||||
_ : Vector -> flags
|
_ : Vector -> flags
|
||||||
_ -> [flags]
|
_ -> [flags]
|
||||||
int_flags = MatOfInt.new (write_flags.flat_map x-> [x.to_integer, x.value]).to_array
|
int_flags = MatOfInt.new (write_flags.flat_map x-> [x.to_integer, x.value])
|
||||||
Panic.catch JException (Java_Codecs.write path self.opencv_mat int_flags) _->
|
Panic.catch JException (Java_Codecs.write path self.opencv_mat int_flags) _->
|
||||||
Error.throw (File_Error.IO_Error (File.new path) 'Failed to write to the file')
|
Error.throw (File_Error.IO_Error (File.new path) 'Failed to write to the file')
|
||||||
|
|
||||||
@ -435,12 +435,10 @@ core_op : Mat -> Any -> (Mat -> Scalar -> Mat -> Nothing) -> Nothing
|
|||||||
core_op mat value function =
|
core_op mat value function =
|
||||||
result = Mat.new
|
result = Mat.new
|
||||||
scalar = case value of
|
scalar = case value of
|
||||||
_ : Vector ->
|
_ : Vector -> Scalar.new value
|
||||||
Scalar.new value.to_array
|
|
||||||
Matrix.Value m ->
|
Matrix.Value m ->
|
||||||
if ((m.rows == mat.rows) && (m.cols == mat.cols) && (m.channels == mat.channels)) then m else Panic.throw Matrix_Error.Dimensions_Not_Equal
|
if ((m.rows == mat.rows) && (m.cols == mat.cols) && (m.channels == mat.channels)) then m else Panic.throw Matrix_Error.Dimensions_Not_Equal
|
||||||
_ ->
|
_ -> Scalar.all value
|
||||||
Scalar.all value
|
|
||||||
function mat scalar result
|
function mat scalar result
|
||||||
Image.Value result
|
Image.Value result
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ type Matrix
|
|||||||
example_from_vector = Matrix.from_vector [1, 1, 0, 0] rows=2
|
example_from_vector = Matrix.from_vector [1, 1, 0, 0] rows=2
|
||||||
from_vector : Vector -> Integer -> Integer -> Matrix
|
from_vector : Vector -> Integer -> Integer -> Matrix
|
||||||
from_vector values rows=1 channels=1 =
|
from_vector values rows=1 channels=1 =
|
||||||
Matrix.Value (Java_Matrix.from_vector values.to_array channels rows)
|
Matrix.Value (Java_Matrix.from_vector values channels rows)
|
||||||
|
|
||||||
## Return the number of matrix rows.
|
## Return the number of matrix rows.
|
||||||
|
|
||||||
@ -397,7 +397,7 @@ core_op mat value function =
|
|||||||
result = Mat.new
|
result = Mat.new
|
||||||
scalar = case value of
|
scalar = case value of
|
||||||
_ : Vector ->
|
_ : Vector ->
|
||||||
Scalar.new value.to_array
|
Scalar.new value
|
||||||
Matrix.Value m ->
|
Matrix.Value m ->
|
||||||
if ((m.rows == mat.rows) && (m.cols == mat.cols) && (m.channels == mat.channels)) then m else Panic.throw Matrix_Error.Dimensions_Not_Equal
|
if ((m.rows == mat.rows) && (m.cols == mat.cols) && (m.channels == mat.channels)) then m else Panic.throw Matrix_Error.Dimensions_Not_Equal
|
||||||
_ ->
|
_ ->
|
||||||
|
@ -47,7 +47,7 @@ type Column
|
|||||||
from_vector : Text -> Vector -> Column
|
from_vector : Text -> Vector -> Column
|
||||||
from_vector name items =
|
from_vector name items =
|
||||||
Illegal_Argument.handle_java_exception <|
|
Illegal_Argument.handle_java_exception <|
|
||||||
Column.Value (Java_Column.fromItems name items.to_array)
|
Column.Value (Java_Column.fromItems name items)
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
Creates a new column given a name and an internal Java storage.
|
Creates a new column given a name and an internal Java storage.
|
||||||
@ -67,7 +67,7 @@ type Column
|
|||||||
from_vector_repeated : Text -> Vector -> Integer -> Column
|
from_vector_repeated : Text -> Vector -> Integer -> Column
|
||||||
from_vector_repeated name items repeats =
|
from_vector_repeated name items repeats =
|
||||||
Illegal_Argument.handle_java_exception <|
|
Illegal_Argument.handle_java_exception <|
|
||||||
Column.Value (Java_Column.fromRepeatedItems name items.to_array repeats)
|
Column.Value (Java_Column.fromRepeatedItems name items repeats)
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
|
|
||||||
@ -1783,7 +1783,7 @@ type Column
|
|||||||
Sort_Direction.Ascending -> True
|
Sort_Direction.Ascending -> True
|
||||||
Sort_Direction.Descending -> False
|
Sort_Direction.Descending -> False
|
||||||
rule = OrderBuilder.OrderRule.new self.java_column order_bool missing_last
|
rule = OrderBuilder.OrderRule.new self.java_column order_bool missing_last
|
||||||
mask = OrderBuilder.buildOrderMask [rule].to_array
|
mask = OrderBuilder.buildOrderMask [rule]
|
||||||
new_col = self.java_column.applyMask mask
|
new_col = self.java_column.applyMask mask
|
||||||
Column.Value new_col
|
Column.Value new_col
|
||||||
_ ->
|
_ ->
|
||||||
@ -2046,7 +2046,7 @@ normalize_string_for_display string =
|
|||||||
A helper to create a new table consisting of slices of the original table.
|
A helper to create a new table consisting of slices of the original table.
|
||||||
slice_ranges column ranges =
|
slice_ranges column ranges =
|
||||||
normalized = Index_Sub_Range_Module.normalize_ranges ranges
|
normalized = Index_Sub_Range_Module.normalize_ranges ranges
|
||||||
Column.Value (column.java_column.slice normalized.to_array)
|
Column.Value (column.java_column.slice normalized)
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
Creates a storage builder suitable for building a column for the provided
|
Creates a storage builder suitable for building a column for the provided
|
||||||
|
@ -186,22 +186,22 @@ type Data_Formatter
|
|||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
make_boolean_parser self = self.wrap_base_parser <|
|
make_boolean_parser self = self.wrap_base_parser <|
|
||||||
BooleanParser.new self.true_values.to_array self.false_values.to_array
|
BooleanParser.new self.true_values self.false_values
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
make_date_parser self = self.wrap_base_parser <|
|
make_date_parser self = self.wrap_base_parser <|
|
||||||
Panic.catch Any handler=(caught_panic-> Error.throw (Illegal_Argument.Error caught_panic.payload.getMessage)) <|
|
Panic.catch Any handler=(caught_panic-> Error.throw (Illegal_Argument.Error caught_panic.payload.getMessage)) <|
|
||||||
DateParser.new self.date_formats.to_array self.datetime_locale.java_locale
|
DateParser.new self.date_formats self.datetime_locale.java_locale
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
make_date_time_parser self = self.wrap_base_parser <|
|
make_date_time_parser self = self.wrap_base_parser <|
|
||||||
Panic.catch Any handler=(caught_panic-> Error.throw (Illegal_Argument.Error caught_panic.payload.getMessage)) <|
|
Panic.catch Any handler=(caught_panic-> Error.throw (Illegal_Argument.Error caught_panic.payload.getMessage)) <|
|
||||||
DateTimeParser.new self.datetime_formats.to_array self.datetime_locale.java_locale
|
DateTimeParser.new self.datetime_formats self.datetime_locale.java_locale
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
make_time_of_day_parser self = self.wrap_base_parser <|
|
make_time_of_day_parser self = self.wrap_base_parser <|
|
||||||
Panic.catch Any handler=(caught_panic-> Error.throw (Illegal_Argument.Error caught_panic.payload.getMessage)) <|
|
Panic.catch Any handler=(caught_panic-> Error.throw (Illegal_Argument.Error caught_panic.payload.getMessage)) <|
|
||||||
TimeOfDayParser.new self.time_formats.to_array self.datetime_locale.java_locale
|
TimeOfDayParser.new self.time_formats self.datetime_locale.java_locale
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
make_identity_parser self = self.wrap_base_parser IdentityParser.new
|
make_identity_parser self = self.wrap_base_parser IdentityParser.new
|
||||||
@ -242,7 +242,7 @@ type Data_Formatter
|
|||||||
## PRIVATE
|
## PRIVATE
|
||||||
make_auto_parser self =
|
make_auto_parser self =
|
||||||
fallback_parser = self.make_identity_parser
|
fallback_parser = self.make_identity_parser
|
||||||
TypeInferringParser.new self.get_specific_type_parsers.to_array fallback_parser
|
TypeInferringParser.new self.get_specific_type_parsers fallback_parser
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
make_integer_formatter self =
|
make_integer_formatter self =
|
||||||
@ -289,7 +289,7 @@ type Data_Formatter
|
|||||||
make_auto_formatter self =
|
make_auto_formatter self =
|
||||||
# TODO The panic rethrow+recover is a workaround for the vector error propagation bug.
|
# TODO The panic rethrow+recover is a workaround for the vector error propagation bug.
|
||||||
formatters = Panic.recover Illegal_Argument (self.get_specific_type_formatters.map Panic.rethrow)
|
formatters = Panic.recover Illegal_Argument (self.get_specific_type_formatters.map Panic.rethrow)
|
||||||
AnyObjectFormatter.new formatters.to_array
|
AnyObjectFormatter.new formatters
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
make_formatter_for_column_type self (column_type : Value_Type) = case column_type of
|
make_formatter_for_column_type self (column_type : Value_Type) = case column_type of
|
||||||
|
@ -28,7 +28,7 @@ type Expression
|
|||||||
handle_arguments = handle_java_error IllegalArgumentException Expression_Error.Argument_Mismatch
|
handle_arguments = handle_java_error IllegalArgumentException Expression_Error.Argument_Mismatch
|
||||||
|
|
||||||
handle_parse_error <| handle_unsupported <| handle_arguments <|
|
handle_parse_error <| handle_unsupported <| handle_arguments <|
|
||||||
ExpressionVisitorImpl.evaluate expression get_column make_constant module_name type_name var_args_functions.to_array
|
ExpressionVisitorImpl.evaluate expression get_column make_constant module_name type_name var_args_functions
|
||||||
|
|
||||||
type Expression_Error
|
type Expression_Error
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
|
@ -91,7 +91,7 @@ type Table
|
|||||||
if cols.is_empty then Error.throw (Illegal_Argument.Error "Cannot create a table with no columns.") else
|
if cols.is_empty then Error.throw (Illegal_Argument.Error "Cannot create a table with no columns.") else
|
||||||
if (cols.all c-> c.getSize == cols.first.getSize).not then Error.throw (Illegal_Argument.Error "All columns must have the same row count.") else
|
if (cols.all c-> c.getSize == cols.first.getSize).not then Error.throw (Illegal_Argument.Error "All columns must have the same row count.") else
|
||||||
if cols.distinct .getName . length != cols.length then Error.throw (Illegal_Argument.Error "Column names must be distinct.") else
|
if cols.distinct .getName . length != cols.length then Error.throw (Illegal_Argument.Error "Column names must be distinct.") else
|
||||||
Table.Value (Java_Table.new cols.to_array)
|
Table.Value (Java_Table.new cols)
|
||||||
|
|
||||||
## Creates a new table from a vector of column names and a vector of vectors
|
## Creates a new table from a vector of column names and a vector of vectors
|
||||||
specifying row contents.
|
specifying row contents.
|
||||||
@ -595,11 +595,11 @@ type Table
|
|||||||
|
|
||||||
on_problems.attach_problems_before validated.problems <| Illegal_Argument.handle_java_exception <|
|
on_problems.attach_problems_before validated.problems <| Illegal_Argument.handle_java_exception <|
|
||||||
java_key_columns = validated.key_columns.map .java_column
|
java_key_columns = validated.key_columns.map .java_column
|
||||||
index = self.java_table.indexFromColumns java_key_columns.to_array
|
index = self.java_table.indexFromColumns java_key_columns
|
||||||
|
|
||||||
new_columns = validated.valid_columns.map c->(Aggregate_Column_Helper.java_aggregator c.first c.second)
|
new_columns = validated.valid_columns.map c->(Aggregate_Column_Helper.java_aggregator c.first c.second)
|
||||||
|
|
||||||
java_table = index.makeTable new_columns.to_array
|
java_table = index.makeTable new_columns
|
||||||
new_table = Table.Value java_table
|
new_table = Table.Value java_table
|
||||||
|
|
||||||
on_problems.attach_problems_after new_table <|
|
on_problems.attach_problems_after new_table <|
|
||||||
@ -689,7 +689,7 @@ type Table
|
|||||||
Case_Sensitivity.Insensitive locale -> ObjectComparator.new False locale.java_locale
|
Case_Sensitivity.Insensitive locale -> ObjectComparator.new False locale.java_locale
|
||||||
|
|
||||||
java_table = Illegal_Argument.handle_java_exception <| Incomparable_Values.handle_errors <|
|
java_table = Illegal_Argument.handle_java_exception <| Incomparable_Values.handle_errors <|
|
||||||
self.java_table.orderBy java_columns.to_array directions.to_array comparator
|
self.java_table.orderBy java_columns directions comparator
|
||||||
Table.Value java_table
|
Table.Value java_table
|
||||||
|
|
||||||
## Returns the distinct set of rows within the specified columns from the
|
## Returns the distinct set of rows within the specified columns from the
|
||||||
@ -735,7 +735,7 @@ type Table
|
|||||||
java_columns = key_columns.map .java_column
|
java_columns = key_columns.map .java_column
|
||||||
text_folding_strategy = Case_Sensitivity.folding_strategy case_sensitivity
|
text_folding_strategy = Case_Sensitivity.folding_strategy case_sensitivity
|
||||||
java_table = Illegal_Argument.handle_java_exception <|
|
java_table = Illegal_Argument.handle_java_exception <|
|
||||||
self.java_table.distinct java_columns.to_array text_folding_strategy
|
self.java_table.distinct java_columns text_folding_strategy
|
||||||
on_problems.attach_problems_after (Table.Value java_table) <|
|
on_problems.attach_problems_after (Table.Value java_table) <|
|
||||||
problems = java_table.getProblems
|
problems = java_table.getProblems
|
||||||
Java_Problems.parse_aggregated_problems problems
|
Java_Problems.parse_aggregated_problems problems
|
||||||
@ -1796,7 +1796,7 @@ type Table
|
|||||||
java_id = id_columns.map .java_column
|
java_id = id_columns.map .java_column
|
||||||
|
|
||||||
unique.mark_used (id_columns.map .name)
|
unique.mark_used (id_columns.map .name)
|
||||||
result = Table.Value (Java_Table.transpose java_id.to_array java_data.to_array (unique.make_unique attribute_column_name) (unique.make_unique value_column_name))
|
result = Table.Value (Java_Table.transpose java_id java_data (unique.make_unique attribute_column_name) (unique.make_unique value_column_name))
|
||||||
problem_builder.report_unique_name_strategy unique
|
problem_builder.report_unique_name_strategy unique
|
||||||
|
|
||||||
problem_builder.attach_problems_after on_problems result
|
problem_builder.attach_problems_after on_problems result
|
||||||
@ -1884,7 +1884,7 @@ type Table
|
|||||||
|
|
||||||
problem_builder.attach_problems_before on_problems <| Illegal_Argument.handle_java_exception <|
|
problem_builder.attach_problems_before on_problems <| Illegal_Argument.handle_java_exception <|
|
||||||
java_key_columns = grouping.map .java_column
|
java_key_columns = grouping.map .java_column
|
||||||
index = self.java_table.indexFromColumns java_key_columns.to_array
|
index = self.java_table.indexFromColumns java_key_columns
|
||||||
|
|
||||||
name_mapper = if matched_name.is_empty then Aggregate_Column_Helper.default_aggregate_column_name else
|
name_mapper = if matched_name.is_empty then Aggregate_Column_Helper.default_aggregate_column_name else
|
||||||
if validated_values.length == 1 then (_ -> "") else
|
if validated_values.length == 1 then (_ -> "") else
|
||||||
@ -1900,7 +1900,7 @@ type Table
|
|||||||
result = case matched_name.is_empty of
|
result = case matched_name.is_empty of
|
||||||
True ->
|
True ->
|
||||||
group_by = grouping.map g->(Aggregate_Column_Helper.java_aggregator g.name (Aggregate_Column.Group_By g))
|
group_by = grouping.map g->(Aggregate_Column_Helper.java_aggregator g.name (Aggregate_Column.Group_By g))
|
||||||
index.makeTable (group_by + data_columns).to_array
|
index.makeTable (group_by + data_columns)
|
||||||
False ->
|
False ->
|
||||||
aggregate_names = validated_values.map c->
|
aggregate_names = validated_values.map c->
|
||||||
c.new_name.if_nothing (name_mapper c)
|
c.new_name.if_nothing (name_mapper c)
|
||||||
@ -2080,7 +2080,7 @@ print_table header rows indices_count format_term =
|
|||||||
A helper to create a new table consisting of slices of the original table.
|
A helper to create a new table consisting of slices of the original table.
|
||||||
slice_ranges table ranges =
|
slice_ranges table ranges =
|
||||||
normalized = Index_Sub_Range_Module.normalize_ranges ranges
|
normalized = Index_Sub_Range_Module.normalize_ranges ranges
|
||||||
Table.Value (table.java_table.slice normalized.to_array)
|
Table.Value (table.java_table.slice normalized)
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
make_join_helpers left_table right_table =
|
make_join_helpers left_table right_table =
|
||||||
|
@ -103,5 +103,5 @@ make_grouped_ordered_enumeration name grouping_columns ordering from step =
|
|||||||
enum_value = nth_index from step enum_ix
|
enum_value = nth_index from step enum_ix
|
||||||
long_array.set row_ix enum_value
|
long_array.set row_ix enum_value
|
||||||
|
|
||||||
storage = LongStorage.fromArray long_array.to_array
|
storage = LongStorage.fromArray long_array
|
||||||
Column.from_storage name storage
|
Column.from_storage name storage
|
||||||
|
@ -220,7 +220,7 @@ java_aggregator name column =
|
|||||||
Count _ -> CountAggregator.new name
|
Count _ -> CountAggregator.new name
|
||||||
Count_Distinct columns _ ignore_nothing ->
|
Count_Distinct columns _ ignore_nothing ->
|
||||||
resolved = columns.map .java_column
|
resolved = columns.map .java_column
|
||||||
CountDistinctAggregator.new name resolved.to_array ignore_nothing
|
CountDistinctAggregator.new name resolved ignore_nothing
|
||||||
Count_Not_Nothing c _ -> CountNothingAggregator.new name c.java_column False
|
Count_Not_Nothing c _ -> CountNothingAggregator.new name c.java_column False
|
||||||
Count_Nothing c _ -> CountNothingAggregator.new name c.java_column True
|
Count_Nothing c _ -> CountNothingAggregator.new name c.java_column True
|
||||||
Count_Not_Empty c _ -> CountEmptyAggregator.new name c.java_column False
|
Count_Not_Empty c _ -> CountEmptyAggregator.new name c.java_column False
|
||||||
@ -235,12 +235,12 @@ java_aggregator name column =
|
|||||||
if ordering.is_nothing then FirstAggregator.new name c.java_column ignore_nothing else
|
if ordering.is_nothing then FirstAggregator.new name c.java_column ignore_nothing else
|
||||||
order_columns = ordering.map c->c.column.java_column
|
order_columns = ordering.map c->c.column.java_column
|
||||||
order_directions = ordering.map c->c.direction.to_sign
|
order_directions = ordering.map c->c.direction.to_sign
|
||||||
FirstAggregator.new name c.java_column ignore_nothing order_columns.to_array order_directions.to_array
|
FirstAggregator.new name c.java_column ignore_nothing order_columns order_directions
|
||||||
Last c _ ignore_nothing ordering ->
|
Last c _ ignore_nothing ordering ->
|
||||||
if ordering.is_nothing then LastAggregator.new name c.java_column ignore_nothing else
|
if ordering.is_nothing then LastAggregator.new name c.java_column ignore_nothing else
|
||||||
order_columns = ordering.map c->c.column.java_column
|
order_columns = ordering.map c->c.column.java_column
|
||||||
order_direction = ordering.map c->c.direction.to_sign
|
order_direction = ordering.map c->c.direction.to_sign
|
||||||
LastAggregator.new name c.java_column ignore_nothing order_columns.to_array order_direction.to_array
|
LastAggregator.new name c.java_column ignore_nothing order_columns order_direction
|
||||||
Maximum c _ -> MinOrMaxAggregator.new name c.java_column MinOrMaxAggregator.MAX
|
Maximum c _ -> MinOrMaxAggregator.new name c.java_column MinOrMaxAggregator.MAX
|
||||||
Minimum c _ -> MinOrMaxAggregator.new name c.java_column MinOrMaxAggregator.MIN
|
Minimum c _ -> MinOrMaxAggregator.new name c.java_column MinOrMaxAggregator.MIN
|
||||||
Shortest c _ -> ShortestOrLongestAggregator.new name c.java_column ShortestOrLongestAggregator.SHORTEST
|
Shortest c _ -> ShortestOrLongestAggregator.new name c.java_column ShortestOrLongestAggregator.SHORTEST
|
||||||
|
@ -118,10 +118,10 @@ prepare_reader java_reader format max_columns on_problems newline_override=Nothi
|
|||||||
QuoteStrippingParser.new quote
|
QuoteStrippingParser.new quote
|
||||||
value_parser = if format.value_formatter.is_nothing then base_parser else
|
value_parser = if format.value_formatter.is_nothing then base_parser else
|
||||||
wrapped = format.value_formatter.wrap_base_parser base_parser
|
wrapped = format.value_formatter.wrap_base_parser base_parser
|
||||||
TypeInferringParser.new format.value_formatter.get_specific_type_parsers.to_array wrapped
|
TypeInferringParser.new format.value_formatter.get_specific_type_parsers wrapped
|
||||||
cell_type_guesser = if format.headers != Infer then Nothing else
|
cell_type_guesser = if format.headers != Infer then Nothing else
|
||||||
formatter = format.value_formatter.if_nothing Data_Formatter.Value
|
formatter = format.value_formatter.if_nothing Data_Formatter.Value
|
||||||
TypeInferringParser.new formatter.get_specific_type_parsers.to_array IdentityParser.new
|
TypeInferringParser.new formatter.get_specific_type_parsers IdentityParser.new
|
||||||
newline = newline_override.if_nothing <| case format.line_endings of
|
newline = newline_override.if_nothing <| case format.line_endings of
|
||||||
Infer -> Nothing
|
Infer -> Nothing
|
||||||
endings -> endings.to_text
|
endings -> endings.to_text
|
||||||
|
@ -70,7 +70,7 @@ append_to_file table format file match_columns on_problems =
|
|||||||
Nothing -> table.java_table
|
Nothing -> table.java_table
|
||||||
Detected_Headers.Existing column_names -> case match_columns of
|
Detected_Headers.Existing column_names -> case match_columns of
|
||||||
Match_Columns.By_Name ->
|
Match_Columns.By_Name ->
|
||||||
ColumnMapper.mapColumnsByName table.java_table column_names.to_array
|
ColumnMapper.mapColumnsByName table.java_table column_names
|
||||||
Match_Columns.By_Position ->
|
Match_Columns.By_Position ->
|
||||||
column_count = column_names.length
|
column_count = column_names.length
|
||||||
ColumnMapper.mapColumnsByPosition table.java_table column_count
|
ColumnMapper.mapColumnsByPosition table.java_table column_count
|
||||||
@ -156,7 +156,7 @@ write_to_writer table format java_writer separator_override=Nothing needs_leadin
|
|||||||
endings -> endings.to_text
|
endings -> endings.to_text
|
||||||
if needs_leading_newline then
|
if needs_leading_newline then
|
||||||
java_writer.write newline
|
java_writer.write newline
|
||||||
writer = DelimitedWriter.new java_writer column_formatters.to_array format.delimiter newline quote_characters.first quote_characters.second format.comment_character quote_behavior write_headers
|
writer = DelimitedWriter.new java_writer column_formatters format.delimiter newline quote_characters.first quote_characters.second format.comment_character quote_behavior write_headers
|
||||||
writer.write table.java_table
|
writer.write table.java_table
|
||||||
warnings = Java_Problems.parse_aggregated_problems writer.getReportedWarnings
|
warnings = Java_Problems.parse_aggregated_problems writer.getReportedWarnings
|
||||||
Problem_Behavior.Report_Warning.attach_problems_after Nothing warnings
|
Problem_Behavior.Report_Warning.attach_problems_after Nothing warnings
|
||||||
|
@ -55,16 +55,14 @@ type Vector_Builder
|
|||||||
Materializes the actual vector from this builder.
|
Materializes the actual vector from this builder.
|
||||||
build : Vector Any
|
build : Vector Any
|
||||||
build self =
|
build self =
|
||||||
array = Array.new self.length
|
vec_builder = Vector.new_builder self.length
|
||||||
go ix elem = case elem of
|
go elem = case elem of
|
||||||
Leaf vec ->
|
Leaf vec -> vec_builder.append_vector_range vec
|
||||||
Array.copy vec.to_array 0 array ix vec.length
|
|
||||||
ix + vec.length
|
|
||||||
Append l r _ ->
|
Append l r _ ->
|
||||||
ix2 = go ix l
|
go l
|
||||||
go ix2 r
|
go r
|
||||||
go 0 self
|
go self
|
||||||
Vector.from_polyglot_array array
|
vec_builder.to_vector
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
|
|
||||||
|
@ -549,5 +549,6 @@ Any.should_not_contain self element frames_to_skip=0 =
|
|||||||
rules of the particular type - be it a `Vector`, `Text` or any custom type
|
rules of the particular type - be it a `Vector`, `Text` or any custom type
|
||||||
implementing a method `contains : a -> Boolean`.
|
implementing a method `contains : a -> Boolean`.
|
||||||
Error.should_not_contain : Any -> Integer -> Test_Result
|
Error.should_not_contain : Any -> Integer -> Test_Result
|
||||||
Error.should_not_contain self _ frames_to_skip=0 =
|
Error.should_not_contain self element frames_to_skip=0 =
|
||||||
|
_ = [element]
|
||||||
Test.fail_match_on_unexpected_error self 1+frames_to_skip
|
Test.fail_match_on_unexpected_error self 1+frames_to_skip
|
||||||
|
@ -333,13 +333,13 @@ class BuiltinTypesTest
|
|||||||
val requestId = UUID.randomUUID()
|
val requestId = UUID.randomUUID()
|
||||||
|
|
||||||
val metadata = new Metadata
|
val metadata = new Metadata
|
||||||
val idMain = metadata.addItem(45, 19)
|
val idMain = metadata.addItem(40, 18)
|
||||||
|
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.Data.Array.Array
|
"""from Standard.Base import Vector
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| Array.new_1 42
|
| [42].to_array
|
||||||
|""".stripMargin.linesIterator.mkString("\n")
|
|""".stripMargin.linesIterator.mkString("\n")
|
||||||
val contents = metadata.appendToCode(code)
|
val contents = metadata.appendToCode(code)
|
||||||
|
|
||||||
@ -359,13 +359,13 @@ class BuiltinTypesTest
|
|||||||
val requestId = UUID.randomUUID()
|
val requestId = UUID.randomUUID()
|
||||||
|
|
||||||
val metadata = new Metadata
|
val metadata = new Metadata
|
||||||
val idMain = metadata.addItem(47, 34)
|
val idMain = metadata.addItem(40, 7)
|
||||||
|
|
||||||
val code =
|
val code =
|
||||||
"""from Standard.Base import Vector, Array
|
"""from Standard.Base import Vector
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| Vector.from_array Array.empty
|
| []
|
||||||
|""".stripMargin.linesIterator.mkString("\n")
|
|""".stripMargin.linesIterator.mkString("\n")
|
||||||
val contents = metadata.appendToCode(code)
|
val contents = metadata.appendToCode(code)
|
||||||
|
|
||||||
|
@ -0,0 +1,112 @@
|
|||||||
|
package org.enso.interpreter.node.expression.builtin.immutable;
|
||||||
|
|
||||||
|
import com.oracle.truffle.api.CompilerDirectives;
|
||||||
|
import com.oracle.truffle.api.dsl.Cached;
|
||||||
|
import com.oracle.truffle.api.dsl.Fallback;
|
||||||
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
|
import com.oracle.truffle.api.interop.InteropLibrary;
|
||||||
|
import com.oracle.truffle.api.interop.InvalidArrayIndexException;
|
||||||
|
import com.oracle.truffle.api.interop.UnsupportedMessageException;
|
||||||
|
import com.oracle.truffle.api.library.CachedLibrary;
|
||||||
|
import com.oracle.truffle.api.nodes.Node;
|
||||||
|
import org.enso.interpreter.dsl.BuiltinMethod;
|
||||||
|
import org.enso.interpreter.node.expression.builtin.mutable.CopyNode;
|
||||||
|
import org.enso.interpreter.runtime.EnsoContext;
|
||||||
|
import org.enso.interpreter.runtime.builtin.Builtins;
|
||||||
|
import org.enso.interpreter.runtime.data.Array;
|
||||||
|
import org.enso.interpreter.runtime.data.Vector;
|
||||||
|
import org.enso.interpreter.runtime.error.PanicException;
|
||||||
|
|
||||||
|
@BuiltinMethod(
|
||||||
|
type = "Vector",
|
||||||
|
name = "flatten",
|
||||||
|
description = "Flattens a vector of vectors into a single vector.",
|
||||||
|
autoRegister = false)
|
||||||
|
public abstract class FlattenVectorNode extends Node {
|
||||||
|
static FlattenVectorNode build() {
|
||||||
|
return FlattenVectorNodeGen.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract Vector execute(Object self);
|
||||||
|
|
||||||
|
@Specialization
|
||||||
|
Vector fromVector(
|
||||||
|
Vector self, @Cached CopyNode copyNode, @CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
try {
|
||||||
|
return flatten(self.toArray(), copyNode, interop);
|
||||||
|
} catch (UnsupportedMessageException e) {
|
||||||
|
CompilerDirectives.transferToInterpreter();
|
||||||
|
Builtins builtins = EnsoContext.get(this).getBuiltins();
|
||||||
|
throw new PanicException(
|
||||||
|
builtins.error().makeTypeError(builtins.vector(), self, "self"), this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Specialization
|
||||||
|
Vector fromArray(
|
||||||
|
Array self, @Cached CopyNode copyNode, @CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
try {
|
||||||
|
return flatten(self, copyNode, interop);
|
||||||
|
} catch (UnsupportedMessageException e) {
|
||||||
|
throw unsupportedException(self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Specialization(guards = "interop.hasArrayElements(self)")
|
||||||
|
Vector fromArrayLike(
|
||||||
|
Object self, @Cached CopyNode copyNode, @CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
try {
|
||||||
|
return flatten(self, copyNode, interop);
|
||||||
|
} catch (UnsupportedMessageException e) {
|
||||||
|
throw unsupportedException(self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Fallback
|
||||||
|
Vector fromUnknown(Object self) {
|
||||||
|
throw unsupportedException(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
private PanicException unsupportedException(Object self) {
|
||||||
|
CompilerDirectives.transferToInterpreter();
|
||||||
|
var ctx = EnsoContext.get(this);
|
||||||
|
var err = ctx.getBuiltins().error().makeTypeError("polyglot array", self, "self");
|
||||||
|
throw new PanicException(err, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector flatten(Object storage, CopyNode copyNode, InteropLibrary interop)
|
||||||
|
throws UnsupportedMessageException {
|
||||||
|
try {
|
||||||
|
long length = interop.getArraySize(storage);
|
||||||
|
|
||||||
|
long flattened_length = 0;
|
||||||
|
for (long i = 0; i < length; i++) {
|
||||||
|
var item = interop.readArrayElement(storage, i);
|
||||||
|
if (!interop.hasArrayElements(item)) {
|
||||||
|
CompilerDirectives.transferToInterpreter();
|
||||||
|
Builtins builtins = EnsoContext.get(this).getBuiltins();
|
||||||
|
throw new PanicException(
|
||||||
|
builtins.error().makeTypeError(builtins.vector(), item, "[" + i + "]"), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
flattened_length += interop.getArraySize(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
Array result = Array.allocate(flattened_length);
|
||||||
|
long current_index = 0;
|
||||||
|
for (long i = 0; i < length; i++) {
|
||||||
|
var item = interop.readArrayElement(storage, i);
|
||||||
|
var item_length = interop.getArraySize(item);
|
||||||
|
copyNode.execute(item, 0, result, current_index, item_length);
|
||||||
|
current_index += item_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Vector.fromArray(result);
|
||||||
|
} catch (InvalidArrayIndexException e) {
|
||||||
|
CompilerDirectives.transferToInterpreter();
|
||||||
|
Builtins builtins = EnsoContext.get(this).getBuiltins();
|
||||||
|
throw new PanicException(
|
||||||
|
builtins.error().makeInvalidArrayIndex(storage, e.getInvalidIndex()), this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,114 @@
|
|||||||
|
package org.enso.interpreter.node.expression.builtin.immutable;
|
||||||
|
|
||||||
|
import com.oracle.truffle.api.dsl.Cached;
|
||||||
|
import com.oracle.truffle.api.dsl.Fallback;
|
||||||
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
|
import com.oracle.truffle.api.interop.InteropLibrary;
|
||||||
|
import com.oracle.truffle.api.interop.UnsupportedMessageException;
|
||||||
|
import com.oracle.truffle.api.library.CachedLibrary;
|
||||||
|
import com.oracle.truffle.api.nodes.Node;
|
||||||
|
import org.enso.interpreter.dsl.BuiltinMethod;
|
||||||
|
import org.enso.interpreter.node.expression.builtin.mutable.CopyNode;
|
||||||
|
import org.enso.interpreter.runtime.EnsoContext;
|
||||||
|
import org.enso.interpreter.runtime.data.Array;
|
||||||
|
import org.enso.interpreter.runtime.data.Vector;
|
||||||
|
import org.enso.interpreter.runtime.error.PanicException;
|
||||||
|
|
||||||
|
@BuiltinMethod(
|
||||||
|
type = "Vector",
|
||||||
|
name = "insert_builtin",
|
||||||
|
description = "Inserts a set of values into the Vector at the specified index.",
|
||||||
|
autoRegister = false)
|
||||||
|
public abstract class InsertBuiltinVectorNode extends Node {
|
||||||
|
static InsertBuiltinVectorNode build() {
|
||||||
|
return InsertBuiltinVectorNodeGen.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract Vector execute(Object vec, long index, Object values);
|
||||||
|
|
||||||
|
@Specialization
|
||||||
|
Vector fromVector(
|
||||||
|
Vector vec,
|
||||||
|
long index,
|
||||||
|
Vector values,
|
||||||
|
@Cached CopyNode copyNode,
|
||||||
|
@CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
return insertBuiltin(vec.toArray(), index, values.toArray(), copyNode, interop);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Specialization
|
||||||
|
Vector fromArray(
|
||||||
|
Array vec,
|
||||||
|
long index,
|
||||||
|
Vector values,
|
||||||
|
@Cached CopyNode copyNode,
|
||||||
|
@CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
return insertBuiltin(vec, index, values.toArray(), copyNode, interop);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Specialization(guards = "interop.hasArrayElements(vec)")
|
||||||
|
Vector fromArrayLike(
|
||||||
|
Object vec,
|
||||||
|
long index,
|
||||||
|
Vector values,
|
||||||
|
@Cached CopyNode copyNode,
|
||||||
|
@CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
return insertBuiltin(vec, index, values.toArray(), copyNode, interop);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Specialization(guards = "interop.hasArrayElements(values)")
|
||||||
|
Vector fromVectorWithArrayLikeObject(
|
||||||
|
Vector vec,
|
||||||
|
long index,
|
||||||
|
Object values,
|
||||||
|
@Cached CopyNode copyNode,
|
||||||
|
@CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
return insertBuiltin(vec.toArray(), index, values, copyNode, interop);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Specialization(guards = "interop.hasArrayElements(values)")
|
||||||
|
Vector fromArrayWithArrayLikeObject(
|
||||||
|
Array vec,
|
||||||
|
long index,
|
||||||
|
Object values,
|
||||||
|
@Cached CopyNode copyNode,
|
||||||
|
@CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
return insertBuiltin(vec, index, values, copyNode, interop);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Specialization(guards = {"interop.hasArrayElements(vec)", "interop.hasArrayElements(values)"})
|
||||||
|
Vector fromArrayLikeWithArrayLikeObject(
|
||||||
|
Object vec,
|
||||||
|
long index,
|
||||||
|
Object values,
|
||||||
|
@Cached CopyNode copyNode,
|
||||||
|
@CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
return insertBuiltin(vec, index, values, copyNode, interop);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Fallback
|
||||||
|
Vector fromUnknown(Object vec, long index, Object values) {
|
||||||
|
throw unsupportedException(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
private PanicException unsupportedException(Object values) {
|
||||||
|
var ctx = EnsoContext.get(this);
|
||||||
|
var err = ctx.getBuiltins().error().makeTypeError("polyglot array", values, "values");
|
||||||
|
throw new PanicException(err, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector insertBuiltin(
|
||||||
|
Object current, long index, Object values, CopyNode copyNode, InteropLibrary interop) {
|
||||||
|
try {
|
||||||
|
long currentLength = interop.getArraySize(current);
|
||||||
|
long valuesLength = interop.getArraySize(values);
|
||||||
|
Array result = Array.allocate(currentLength + valuesLength);
|
||||||
|
copyNode.execute(current, 0, result, 0, index);
|
||||||
|
copyNode.execute(values, 0, result, index, valuesLength);
|
||||||
|
copyNode.execute(current, index, result, index + valuesLength, currentLength - index);
|
||||||
|
return Vector.fromArray(result);
|
||||||
|
} catch (UnsupportedMessageException e) {
|
||||||
|
throw unsupportedException(values);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,94 @@
|
|||||||
|
package org.enso.interpreter.node.expression.builtin.immutable;
|
||||||
|
|
||||||
|
import com.oracle.truffle.api.CompilerDirectives;
|
||||||
|
import com.oracle.truffle.api.dsl.Cached;
|
||||||
|
import com.oracle.truffle.api.dsl.Fallback;
|
||||||
|
import com.oracle.truffle.api.dsl.Specialization;
|
||||||
|
import com.oracle.truffle.api.interop.InteropLibrary;
|
||||||
|
import com.oracle.truffle.api.interop.UnsupportedMessageException;
|
||||||
|
import com.oracle.truffle.api.library.CachedLibrary;
|
||||||
|
import com.oracle.truffle.api.nodes.Node;
|
||||||
|
import org.enso.interpreter.dsl.BuiltinMethod;
|
||||||
|
import org.enso.interpreter.node.expression.builtin.mutable.CopyNode;
|
||||||
|
import org.enso.interpreter.runtime.EnsoContext;
|
||||||
|
import org.enso.interpreter.runtime.builtin.Builtins;
|
||||||
|
import org.enso.interpreter.runtime.data.Array;
|
||||||
|
import org.enso.interpreter.runtime.data.Vector;
|
||||||
|
import org.enso.interpreter.runtime.error.PanicException;
|
||||||
|
|
||||||
|
@BuiltinMethod(
|
||||||
|
type = "Vector",
|
||||||
|
name = "remove_builtin",
|
||||||
|
description = "Removes a value for the vector at the specified index.",
|
||||||
|
autoRegister = false)
|
||||||
|
public abstract class RemoveAtVectorNode extends Node {
|
||||||
|
static RemoveAtVectorNode build() {
|
||||||
|
return RemoveAtVectorNodeGen.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract Vector execute(Object vec, long index);
|
||||||
|
|
||||||
|
@Specialization
|
||||||
|
Vector fromVector(
|
||||||
|
Vector vec,
|
||||||
|
long index,
|
||||||
|
@Cached CopyNode copyNode,
|
||||||
|
@CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
try {
|
||||||
|
return removeAtIndex(vec.toArray(), index, copyNode, interop);
|
||||||
|
} catch (UnsupportedMessageException e) {
|
||||||
|
CompilerDirectives.transferToInterpreter();
|
||||||
|
Builtins builtins = EnsoContext.get(this).getBuiltins();
|
||||||
|
throw new PanicException(builtins.error().makeTypeError(builtins.vector(), vec, "vec"), this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Specialization
|
||||||
|
Vector fromArray(
|
||||||
|
Array vec,
|
||||||
|
long index,
|
||||||
|
@Cached CopyNode copyNode,
|
||||||
|
@CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
try {
|
||||||
|
return removeAtIndex(vec, index, copyNode, interop);
|
||||||
|
} catch (UnsupportedMessageException e) {
|
||||||
|
throw unsupportedException(vec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Specialization(guards = "interop.hasArrayElements(vec)")
|
||||||
|
Vector fromArrayLike(
|
||||||
|
Object vec,
|
||||||
|
long index,
|
||||||
|
@Cached CopyNode copyNode,
|
||||||
|
@CachedLibrary(limit = "3") InteropLibrary interop) {
|
||||||
|
try {
|
||||||
|
return removeAtIndex(vec, index, copyNode, interop);
|
||||||
|
} catch (UnsupportedMessageException e) {
|
||||||
|
throw unsupportedException(vec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Fallback
|
||||||
|
Vector fromUnknown(Object vec, long index) {
|
||||||
|
throw unsupportedException(vec);
|
||||||
|
}
|
||||||
|
|
||||||
|
private PanicException unsupportedException(Object vec) {
|
||||||
|
CompilerDirectives.transferToInterpreter();
|
||||||
|
var ctx = EnsoContext.get(this);
|
||||||
|
var err = ctx.getBuiltins().error().makeTypeError("polyglot array", vec, "vec");
|
||||||
|
throw new PanicException(err, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector removeAtIndex(
|
||||||
|
Object storage, long index, CopyNode copyArrayNode, InteropLibrary interop)
|
||||||
|
throws UnsupportedMessageException {
|
||||||
|
long length = interop.getArraySize(storage);
|
||||||
|
long actualIndex = index < 0 ? index + length : index;
|
||||||
|
Array array = Array.allocate(length - 1);
|
||||||
|
copyArrayNode.execute(storage, 0, array, 0, actualIndex);
|
||||||
|
copyArrayNode.execute(storage, actualIndex + 1, array, actualIndex, length - actualIndex - 1);
|
||||||
|
return Vector.fromArray(array);
|
||||||
|
}
|
||||||
|
}
|
@ -31,18 +31,8 @@ public abstract class CoerceArrayNode extends Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Specialization
|
@Specialization
|
||||||
Object[] doVector(Vector arr, @Cached HostValueToEnsoNode hostValueToEnsoNode) {
|
Object[] doVector(Vector arr, @Cached CoerceArrayNode coerceArrayNode) {
|
||||||
try {
|
return coerceArrayNode.execute(arr.toArray());
|
||||||
return convertToArray(arr, hostValueToEnsoNode);
|
|
||||||
} catch (UnsupportedMessageException e) {
|
|
||||||
Builtins builtins = EnsoContext.get(this).getBuiltins();
|
|
||||||
Atom err = builtins.error().makeTypeError(builtins.array(), arr, "arr");
|
|
||||||
throw new PanicException(err, this);
|
|
||||||
} catch (InvalidArrayIndexException e) {
|
|
||||||
Builtins builtins = EnsoContext.get(this).getBuiltins();
|
|
||||||
throw new PanicException(
|
|
||||||
builtins.error().makeInvalidArrayIndex(arr, e.getInvalidIndex()), this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Specialization(guards = "interop.hasArrayElements(arr)")
|
@Specialization(guards = "interop.hasArrayElements(arr)")
|
||||||
|
@ -8,25 +8,19 @@ import com.oracle.truffle.api.interop.InvalidArrayIndexException;
|
|||||||
import com.oracle.truffle.api.interop.UnsupportedMessageException;
|
import com.oracle.truffle.api.interop.UnsupportedMessageException;
|
||||||
import com.oracle.truffle.api.library.CachedLibrary;
|
import com.oracle.truffle.api.library.CachedLibrary;
|
||||||
import com.oracle.truffle.api.nodes.Node;
|
import com.oracle.truffle.api.nodes.Node;
|
||||||
import org.enso.interpreter.dsl.BuiltinMethod;
|
|
||||||
import org.enso.interpreter.node.expression.builtin.interop.syntax.HostValueToEnsoNode;
|
import org.enso.interpreter.node.expression.builtin.interop.syntax.HostValueToEnsoNode;
|
||||||
import org.enso.interpreter.runtime.EnsoContext;
|
import org.enso.interpreter.runtime.EnsoContext;
|
||||||
import org.enso.interpreter.runtime.builtin.Builtins;
|
import org.enso.interpreter.runtime.builtin.Builtins;
|
||||||
import org.enso.interpreter.runtime.data.Array;
|
import org.enso.interpreter.runtime.data.Array;
|
||||||
import org.enso.interpreter.runtime.error.PanicException;
|
import org.enso.interpreter.runtime.error.PanicException;
|
||||||
|
|
||||||
@BuiltinMethod(
|
|
||||||
type = "Array",
|
|
||||||
name = "copy",
|
|
||||||
description = "Copies one array to another.",
|
|
||||||
autoRegister = false)
|
|
||||||
public abstract class CopyNode extends Node {
|
public abstract class CopyNode extends Node {
|
||||||
|
public static CopyNode build() {
|
||||||
static CopyNode build() {
|
|
||||||
return CopyNodeGen.create();
|
return CopyNodeGen.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract Object execute(Object src, long source_index, Array dest, long dest_index, long count);
|
public abstract Object execute(
|
||||||
|
Object src, long source_index, Array dest, long dest_index, long count);
|
||||||
|
|
||||||
@Specialization
|
@Specialization
|
||||||
Object doArray(Array src, long source_index, Array dest, long dest_index, long count) {
|
Object doArray(Array src, long source_index, Array dest, long dest_index, long count) {
|
||||||
|
@ -35,37 +35,25 @@ public final class Array implements TruffleObject {
|
|||||||
*
|
*
|
||||||
* @param items the element values
|
* @param items the element values
|
||||||
*/
|
*/
|
||||||
@Builtin.Method(
|
|
||||||
expandVarargs = 4,
|
|
||||||
description = "Creates an array with given elements.",
|
|
||||||
autoRegister = false)
|
|
||||||
public Array(Object... items) {
|
public Array(Object... items) {
|
||||||
assert noNulls(items);
|
assert noNulls(items);
|
||||||
this.items = items;
|
this.items = items;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an uninitialized array of the given size.
|
* Creates an uninitialized array of the given size. The values must be filled before the array is
|
||||||
|
* returned to Enso.
|
||||||
*
|
*
|
||||||
* @param size the size of the created array.
|
* @param size the size of the created array.
|
||||||
*/
|
*/
|
||||||
@Builtin.Method(
|
|
||||||
description = "Creates an uninitialized array of a given size.",
|
|
||||||
autoRegister = false,
|
|
||||||
name = "new")
|
|
||||||
public static Array allocate(long size) {
|
public static Array allocate(long size) {
|
||||||
var arr = new Object[(int) size];
|
var arr = new Object[(int) size];
|
||||||
var ctx = EnsoContext.get(null);
|
|
||||||
var nothing = ctx.getBuiltins().nothing();
|
|
||||||
for (int i = 0; i < arr.length; i++) {
|
|
||||||
arr[i] = nothing;
|
|
||||||
}
|
|
||||||
return new Array(arr);
|
return new Array(arr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final boolean noNulls(Object[] arr) {
|
private static boolean noNulls(Object[] arr) {
|
||||||
for (int i = 0; i < arr.length; i++) {
|
for (Object o : arr) {
|
||||||
if (arr[i] == null) {
|
if (o == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -115,6 +103,7 @@ public final class Array implements TruffleObject {
|
|||||||
}
|
}
|
||||||
return WithWarnings.wrap(EnsoContext.get(warnings), v, extracted);
|
return WithWarnings.wrap(EnsoContext.get(warnings), v, extracted);
|
||||||
}
|
}
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,7 +112,6 @@ public final class Array implements TruffleObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @return an empty array */
|
/** @return an empty array */
|
||||||
@Builtin.Method(description = "Creates an empty Array", autoRegister = false)
|
|
||||||
public static Array empty() {
|
public static Array empty() {
|
||||||
return allocate(0);
|
return allocate(0);
|
||||||
}
|
}
|
||||||
@ -190,8 +178,8 @@ public final class Array implements TruffleObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasWarningElements(Object[] items, WarningsLibrary warnings) {
|
private boolean hasWarningElements(Object[] items, WarningsLibrary warnings) {
|
||||||
for (int i = 0; i < items.length; i++) {
|
for (Object item : items) {
|
||||||
if (warnings.hasWarnings(items[i])) {
|
if (warnings.hasWarnings(item)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -219,9 +207,9 @@ public final class Array implements TruffleObject {
|
|||||||
private EconomicSet<Warning> collectAllWarnings(WarningsLibrary warnings, Node location)
|
private EconomicSet<Warning> collectAllWarnings(WarningsLibrary warnings, Node location)
|
||||||
throws UnsupportedMessageException {
|
throws UnsupportedMessageException {
|
||||||
EconomicSet<Warning> setOfWarnings = EconomicSet.create(new WithWarnings.WarningEquivalence());
|
EconomicSet<Warning> setOfWarnings = EconomicSet.create(new WithWarnings.WarningEquivalence());
|
||||||
for (int i = 0; i < items.length; i++) {
|
for (Object item : items) {
|
||||||
if (warnings.hasWarnings(items[i])) {
|
if (warnings.hasWarnings(item)) {
|
||||||
setOfWarnings.addAll(Arrays.asList(warnings.getWarnings(items[i], location)));
|
setOfWarnings.addAll(Arrays.asList(warnings.getWarnings(item, location)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return setOfWarnings;
|
return setOfWarnings;
|
||||||
|
@ -1,43 +0,0 @@
|
|||||||
package org.enso.interpreter.test;
|
|
||||||
|
|
||||||
import java.net.URI;
|
|
||||||
import org.graalvm.polyglot.Context;
|
|
||||||
import org.graalvm.polyglot.Source;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class ArrayTest extends TestBase {
|
|
||||||
private static Context ctx;
|
|
||||||
|
|
||||||
@BeforeClass
|
|
||||||
public static void prepareCtx() {
|
|
||||||
ctx = createDefaultContext();
|
|
||||||
}
|
|
||||||
|
|
||||||
@AfterClass
|
|
||||||
public static void disposeCtx() {
|
|
||||||
ctx.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void dontExposeNullsOutOfArray() throws Exception {
|
|
||||||
final URI facUri = new URI("memory://choose.enso");
|
|
||||||
final Source facSrc = Source.newBuilder("enso", """
|
|
||||||
from Standard.Base import all
|
|
||||||
|
|
||||||
null =
|
|
||||||
a = Array.new 1
|
|
||||||
b = a.at 0
|
|
||||||
b
|
|
||||||
""", "nulls.enso")
|
|
||||||
.uri(facUri)
|
|
||||||
.buildLiteral();
|
|
||||||
|
|
||||||
var module = ctx.eval(facSrc);
|
|
||||||
var res = module.invokeMember("eval_expression", "null");
|
|
||||||
assertTrue("i null", res.isNull());
|
|
||||||
}
|
|
||||||
}
|
|
@ -193,7 +193,7 @@ class MethodsTest extends InterpreterTest {
|
|||||||
|import Standard.Base.Data.Text.Text
|
|import Standard.Base.Data.Text.Text
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| a = Array.new_1 1
|
| a = [1].to_array
|
||||||
| t_1 = "foo"
|
| t_1 = "foo"
|
||||||
| t_2 = "bar"
|
| t_2 = "bar"
|
||||||
|
|
|
|
||||||
|
@ -21,7 +21,7 @@ class PolyglotTest extends InterpreterTest {
|
|||||||
|main =
|
|main =
|
||||||
| class = Java.lookup_class "org.enso.example.TestClass"
|
| class = Java.lookup_class "org.enso.example.TestClass"
|
||||||
| method = Polyglot.get_member class "add"
|
| method = Polyglot.get_member class "add"
|
||||||
| Polyglot.execute method (Array.new_2 1 2)
|
| Polyglot.execute method ([1, 2].to_array)
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
eval(code) shouldEqual 3
|
eval(code) shouldEqual 3
|
||||||
@ -38,9 +38,8 @@ class PolyglotTest extends InterpreterTest {
|
|||||||
try {
|
try {
|
||||||
eval(code) shouldEqual "An exception shall be thrown"
|
eval(code) shouldEqual "An exception shall be thrown"
|
||||||
} catch {
|
} catch {
|
||||||
case ex: InterpreterException => {
|
case ex: InterpreterException =>
|
||||||
ex.getMessage() shouldEqual null
|
ex.getMessage() shouldEqual null
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"interop exception with a message" in {
|
"interop exception with a message" in {
|
||||||
@ -61,12 +60,11 @@ class PolyglotTest extends InterpreterTest {
|
|||||||
"allow instantiating objects and calling methods on them" in {
|
"allow instantiating objects and calling methods on them" in {
|
||||||
val code =
|
val code =
|
||||||
"""from Standard.Base import all
|
"""from Standard.Base import all
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| class = Java.lookup_class "org.enso.example.TestClass"
|
| class = Java.lookup_class "org.enso.example.TestClass"
|
||||||
| instance = Polyglot.new class (Array.new_1 (x -> x * 2))
|
| instance = Polyglot.new class [x -> x * 2]
|
||||||
| Polyglot.invoke instance "callFunctionAndIncrement" (Array.new_1 10)
|
| Polyglot.invoke instance "callFunctionAndIncrement" [10]
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
eval(code) shouldEqual 21
|
eval(code) shouldEqual 21
|
||||||
}
|
}
|
||||||
@ -74,11 +72,10 @@ class PolyglotTest extends InterpreterTest {
|
|||||||
"allow listing available members of an object" in {
|
"allow listing available members of an object" in {
|
||||||
val code =
|
val code =
|
||||||
"""from Standard.Base import all
|
"""from Standard.Base import all
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| class = Java.lookup_class "org.enso.example.TestClass"
|
| class = Java.lookup_class "org.enso.example.TestClass"
|
||||||
| instance = Polyglot.new class Array.empty
|
| instance = Polyglot.new class []
|
||||||
| members = Polyglot.get_members instance
|
| members = Polyglot.get_members instance
|
||||||
| IO.println members.length
|
| IO.println members.length
|
||||||
| IO.println (members.at 0)
|
| IO.println (members.at 0)
|
||||||
|
@ -19,11 +19,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"return success exit code (Unix)" taggedAs OsUnix in {
|
"return success exit code (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "echo" Array.empty "" False False False
|
| result = System.create_process "echo" [] "" False False False
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
eval(code) shouldEqual 0
|
eval(code) shouldEqual 0
|
||||||
@ -34,11 +33,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"return success exit code (Windows)" taggedAs OsWindows in {
|
"return success exit code (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "cmd" (Array.new_1 "/c") "" False False False
|
| result = System.create_process "cmd" ["/c"] "" False False False
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
eval(code) shouldEqual 0
|
eval(code) shouldEqual 0
|
||||||
@ -49,9 +47,8 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"return error when creating nonexistent command" in {
|
"return error when creating nonexistent command" in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|main = System.create_process "nonexistentcommandxyz" Array.empty "" False False False
|
|main = System.create_process "nonexistentcommandxyz" [] "" False False False
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
val error = the[InterpreterException] thrownBy eval(code)
|
val error = the[InterpreterException] thrownBy eval(code)
|
||||||
@ -64,11 +61,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"return error exit code (Unix)" taggedAs OsUnix in {
|
"return error exit code (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "ls --gibberish") "" False False False
|
| result = System.create_process "bash" ["-c", "ls --gibberish"] "" False False False
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -80,11 +76,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"return error exit code (Windows)" taggedAs OsWindows in {
|
"return error exit code (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "cmd" (Array.new_2 "/c" "exit 7") "" False False False
|
| result = System.create_process "cmd" ["/c", "exit 7"] "" False False False
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -96,11 +91,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stdin chars (Unix)" taggedAs OsUnix in {
|
"redirect stdin chars (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "read line; echo $line") "" True True True
|
| result = System.create_process "bash" ["-c", "read line; echo $line"] "" True True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -113,11 +107,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stdin chars (Windows)" taggedAs OsWindows in {
|
"redirect stdin chars (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "PowerShell" (Array.new_2 "-Command" "[System.Console]::ReadLine()") "" True True True
|
| result = System.create_process "PowerShell" ["-Command", "[System.Console]::ReadLine()"] "" True True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -131,11 +124,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
val input = Random.nextBytes(Byte.MaxValue)
|
val input = Random.nextBytes(Byte.MaxValue)
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "wc -c") "" True True True
|
| result = System.create_process "bash" ["-c", "wc -c"] "" True True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -150,11 +142,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
pending
|
pending
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "echo 42") "" True True True
|
| result = System.create_process "bash" ["-c", "echo 42"] "" True True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -167,11 +158,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stdin unused (Windows)" taggedAs OsWindows in {
|
"redirect stdin unused (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "cmd" (Array.new_2 "/c" "echo 9") "" True True True
|
| result = System.create_process "cmd" ["/c", "echo 9"] "" True True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -184,11 +174,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stdin empty (Unix)" taggedAs OsUnix in {
|
"redirect stdin empty (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "echo 9") "" True True True
|
| result = System.create_process "bash" ["-c", "echo 9"] "" True True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -200,11 +189,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stdin empty (Windows)" taggedAs OsWindows in {
|
"redirect stdin empty (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "cmd" (Array.new_2 "/c" "echo 9") "" True True True
|
| result = System.create_process "cmd" ["/c", "echo 9"] "" True True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -216,11 +204,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"provide stdin string (Unix)" taggedAs OsUnix in {
|
"provide stdin string (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "read line; printf $line") "hello" False False False
|
| result = System.create_process "bash" ["-c", "read line; printf $line"] "hello" False False False
|
||||||
| result.stdout
|
| result.stdout
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -232,11 +219,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"provide stdin string (Windows)" taggedAs OsWindows in {
|
"provide stdin string (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "PowerShell" (Array.new_2 "-Command" "[System.Console]::ReadLine()") "hello" False False False
|
| result = System.create_process "PowerShell" ["-Command", "[System.Console]::ReadLine()"] "hello" False False False
|
||||||
| result.stdout
|
| result.stdout
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -248,11 +234,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stdout chars (Unix)" taggedAs OsUnix in {
|
"redirect stdout chars (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "echo foobar") "" False True True
|
| result = System.create_process "bash" ["-c", "echo foobar"] "" False True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -264,11 +249,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stdout chars (Windows)" taggedAs OsWindows in {
|
"redirect stdout chars (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "cmd" (Array.new_2 "/c" "echo foobar") "" False True True
|
| result = System.create_process "cmd" ["/c", "echo foobar"] "" False True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -280,11 +264,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stdout binary (Unix)" taggedAs OsUnix in {
|
"redirect stdout binary (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "printf '%b' '\x01\x0F\x10'") "" False True True
|
| result = System.create_process "bash" ["-c", "printf '%b' '\x01\x0F\x10'"] "" False True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -296,11 +279,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"return stdout string (Unix)" taggedAs OsUnix in {
|
"return stdout string (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "echo foobar") "" False False False
|
| result = System.create_process "bash" ["-c", "echo foobar"] "" False False False
|
||||||
| result.stdout
|
| result.stdout
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -313,11 +295,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"return stdout string (Windows)" taggedAs OsWindows in {
|
"return stdout string (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "cmd" (Array.new_2 "/c" "echo foobar") "" False False False
|
| result = System.create_process "cmd" ["/c", "echo foobar"] "" False False False
|
||||||
| result.stdout
|
| result.stdout
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -330,11 +311,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stderr chars (Unix)" taggedAs OsUnix in {
|
"redirect stderr chars (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "printf err 1>&2") "" False True True
|
| result = System.create_process "bash" ["-c", "printf err 1>&2"] "" False True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -346,11 +326,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stderr chars (Windows)" taggedAs OsWindows in {
|
"redirect stderr chars (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "PowerShell" (Array.new_2 "-Command" "[System.Console]::Error.WriteLine('err')") "" False True True
|
| result = System.create_process "PowerShell" ["-Command", "[System.Console]::Error.WriteLine('err')"] "" False True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -362,11 +341,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"redirect stderr binary (Unix)" taggedAs OsUnix in {
|
"redirect stderr binary (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "printf '%b' '\xCA\xFE\xBA\xBE' 1>&2") "" False True True
|
| result = System.create_process "bash" ["-c", "printf '%b' '\xCA\xFE\xBA\xBE' 1>&2"] "" False True True
|
||||||
| result.exit_code
|
| result.exit_code
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -378,11 +356,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"return stderr string (Unix)" taggedAs OsUnix in {
|
"return stderr string (Unix)" taggedAs OsUnix in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "bash" (Array.new_2 "-c" "printf err 1>&2") "" False False False
|
| result = System.create_process "bash" ["-c", "printf err 1>&2"] "" False False False
|
||||||
| result.stderr
|
| result.stderr
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
@ -394,11 +371,10 @@ class SystemProcessTest extends InterpreterTest with OsSpec {
|
|||||||
"return stderr string (Windows)" taggedAs OsWindows in {
|
"return stderr string (Windows)" taggedAs OsWindows in {
|
||||||
val code =
|
val code =
|
||||||
"""import Standard.Base.System
|
"""import Standard.Base.System
|
||||||
|import Standard.Base.Data.Array.Array
|
|
||||||
|from Standard.Base.Data.Boolean import all
|
|from Standard.Base.Data.Boolean import all
|
||||||
|
|
|
|
||||||
|main =
|
|main =
|
||||||
| result = System.create_process "PowerShell" (Array.new_2 "-Command" "[System.Console]::Error.WriteLine('err')") "" False False False
|
| result = System.create_process "PowerShell" ["-Command", "[System.Console]::Error.WriteLine('err')"] "" False False False
|
||||||
| result.stderr
|
| result.stderr
|
||||||
|""".stripMargin
|
|""".stripMargin
|
||||||
|
|
||||||
|
@ -1029,7 +1029,7 @@ spec make_new_connection prefix persistent_connector=True =
|
|||||||
|
|
||||||
If `exploding_index` is accessed, an exception will be thrown.
|
If `exploding_index` is accessed, an exception will be thrown.
|
||||||
make_mock_column name values exploding_index =
|
make_mock_column name values exploding_index =
|
||||||
storage = ExplodingStorage.new values.to_array exploding_index
|
storage = ExplodingStorage.new values exploding_index
|
||||||
Column.from_storage name storage
|
Column.from_storage name storage
|
||||||
|
|
||||||
## PRIVATE
|
## PRIVATE
|
||||||
|
@ -29,7 +29,7 @@ spec = Test.group "Aggregate Columns" <|
|
|||||||
acc = Aggregate_Column_Helper.java_aggregator "Name" resolved
|
acc = Aggregate_Column_Helper.java_aggregator "Name" resolved
|
||||||
indexes = Vector.new table.row_count v->v
|
indexes = Vector.new table.row_count v->v
|
||||||
Illegal_Argument.handle_java_exception <|
|
Illegal_Argument.handle_java_exception <|
|
||||||
acc.aggregate indexes.to_array
|
acc.aggregate indexes
|
||||||
|
|
||||||
if epsilon != False then ((result - expected_result).abs < epsilon).should_be_true else
|
if epsilon != False then ((result - expected_result).abs < epsilon).should_be_true else
|
||||||
result.should_equal expected_result
|
result.should_equal expected_result
|
||||||
|
@ -7,12 +7,10 @@ import Standard.Test.Extensions
|
|||||||
|
|
||||||
Array.method self = 0
|
Array.method self = 0
|
||||||
|
|
||||||
## Returns an array with the same contents as the given vector, surely backed by
|
## Returns the backing array of the given vector. Will be an Enso Array if from
|
||||||
the Enso Array primitive.
|
a literal vector.
|
||||||
make_enso_array vector =
|
make_enso_array vector =
|
||||||
enso_array = Array.new vector.length
|
vector.to_array
|
||||||
Array.copy vector.to_array 0 enso_array 0 vector.length
|
|
||||||
enso_array
|
|
||||||
|
|
||||||
test_arrays array_from_vector =
|
test_arrays array_from_vector =
|
||||||
Test.specify "should allow accessing elements" <|
|
Test.specify "should allow accessing elements" <|
|
||||||
@ -38,11 +36,6 @@ spec =
|
|||||||
(make_enso_array [1,2,3]).should_equal (make_enso_array [1,2,3])
|
(make_enso_array [1,2,3]).should_equal (make_enso_array [1,2,3])
|
||||||
(make_enso_array [1]).should_not_equal (make_enso_array [2])
|
(make_enso_array [1]).should_not_equal (make_enso_array [2])
|
||||||
|
|
||||||
Test.specify "should propagate dataflow errors" <|
|
|
||||||
err = Error.throw (Illegal_State.Error "Foo")
|
|
||||||
res = Array.new err
|
|
||||||
res . should_fail_with Illegal_State
|
|
||||||
|
|
||||||
Test.specify "should not sort in place" <|
|
Test.specify "should not sort in place" <|
|
||||||
arr = make_enso_array [3, 1, 2]
|
arr = make_enso_array [3, 1, 2]
|
||||||
new_arr = arr.sort
|
new_arr = arr.sort
|
||||||
|
@ -39,7 +39,7 @@ spec =
|
|||||||
|
|
||||||
Test.specify "should correctly translate a series of codepoint indices to a grapheme indices in a batch" <|
|
Test.specify "should correctly translate a series of codepoint indices to a grapheme indices in a batch" <|
|
||||||
translate_indices text ixes =
|
translate_indices text ixes =
|
||||||
Vector.from_polyglot_array <| Text_Utils.utf16_indices_to_grapheme_indices text ixes.to_array
|
Vector.from_polyglot_array <| Text_Utils.utf16_indices_to_grapheme_indices text ixes
|
||||||
codepoint_indices = Vector.new text.char_vector.length ix->ix
|
codepoint_indices = Vector.new text.char_vector.length ix->ix
|
||||||
translate_indices text codepoint_indices . should_equal codepoints_to_graphemes
|
translate_indices text codepoint_indices . should_equal codepoints_to_graphemes
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ spec =
|
|||||||
([(Child.Value 1)] == [(Child.Value 2)]).should_be_false
|
([(Child.Value 1)] == [(Child.Value 2)]).should_be_false
|
||||||
|
|
||||||
Test.specify "should dispatch to overriden `==` in arrays" <|
|
Test.specify "should dispatch to overriden `==` in arrays" <|
|
||||||
((Array.new_1 (Child.Value 1)) == (Array.new_1 (Child.Value 101))).should_be_true
|
([Child.Value 1].to_array == [Child.Value 101].to_array).should_be_true
|
||||||
|
|
||||||
Test.specify "should handle recursive atoms without custom `==`" <|
|
Test.specify "should handle recursive atoms without custom `==`" <|
|
||||||
rnd = (Random.new seed=42).java_random
|
rnd = (Random.new seed=42).java_random
|
||||||
|
@ -52,6 +52,6 @@ spec =
|
|||||||
Bar.meh b 2 . should_equal 3
|
Bar.meh b 2 . should_equal 3
|
||||||
Test.group "Fully Qualified Names" <|
|
Test.group "Fully Qualified Names" <|
|
||||||
Test.specify "should be correctly resolved" <|
|
Test.specify "should be correctly resolved" <|
|
||||||
a = Standard.Base.Data.Array.Array.new 10
|
a = Standard.Base.Data.Vector.Vector.new 10 _->Nothing
|
||||||
a.length . should_equal 10
|
a.length . should_equal 10
|
||||||
Standard.Base.Errors.Problem_Behavior.Problem_Behavior.Report_Error.to_text . should_equal "Report_Error"
|
Standard.Base.Errors.Problem_Behavior.Problem_Behavior.Report_Error.to_text . should_equal "Report_Error"
|
||||||
|
@ -13,8 +13,4 @@ spec = Test.group "System" <|
|
|||||||
result = System.create_process "echo" ["foo", "bar"] "" False False False
|
result = System.create_process "echo" ["foo", "bar"] "" False False False
|
||||||
result.exit_code . should_equal 0
|
result.exit_code . should_equal 0
|
||||||
|
|
||||||
result_2 = System.create_process "echo" ["foo", "bar"].to_array "" False False False
|
|
||||||
result_2.exit_code . should_equal 0
|
|
||||||
|
|
||||||
|
|
||||||
main = Test_Suite.run_main spec
|
main = Test_Suite.run_main spec
|
||||||
|
@ -2,7 +2,3 @@
|
|||||||
type Array
|
type Array
|
||||||
at self index = @Builtin_Method "Array.at"
|
at self index = @Builtin_Method "Array.at"
|
||||||
length self = @Builtin_Method "Array.length"
|
length self = @Builtin_Method "Array.length"
|
||||||
|
|
||||||
new_1 item_1 = @Builtin_Method "Array.new_1"
|
|
||||||
new_2 item_1 item_2 = @Builtin_Method "Array.new_2"
|
|
||||||
empty = @Builtin_Method "Array.empty"
|
|
||||||
|
Loading…
Reference in New Issue
Block a user