summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/shared/tonkadur/Tonkadur/Compute.elm')
-rw-r--r-- | src/shared/tonkadur/Tonkadur/Compute.elm | 376 |
1 files changed, 376 insertions, 0 deletions
diff --git a/src/shared/tonkadur/Tonkadur/Compute.elm b/src/shared/tonkadur/Tonkadur/Compute.elm new file mode 100644 index 0000000..b22c3ac --- /dev/null +++ b/src/shared/tonkadur/Tonkadur/Compute.elm @@ -0,0 +1,376 @@ +module Tonkadur.Compute exposing (compute) + +-- Elm ------------------------------------------------------------------------- +import List + +-- Tonkadur -------------------------------------------------------------------- +import Tonkadur.Types + +-------------------------------------------------------------------------------- +-- TYPES ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +add_text_effect : ( + Tonkadur.Types.State -> + String -> + (List.List Tonkadur.Types.Computation) -> + Tonkadur.Types.Value + ) +add_text_effect state name parameters content = + (TextValue + (AugmentedText + { + content = (List.map (compute state) content), + effect_name = name, + effect_parameters = parameters + } + ) + ) + +address : ( + Tonkadur.Types.State -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Value + ) +address state param = + case (compute state param) of + (PointerValue address) -> (PointerValue address) + (StringValue singleton) -> (PointerValue (List.singleton singleton)) + _ -> (PointerValue (List.empty)) + +unsupported_cast : String -> String -> Tonkadur.Types.Value +unsupported_cast from to = + (StringValue ("Unsupported cast from " + from + " to " + to + ".")) + +cast : ( + Tonkadur.Types.State -> + String -> + String -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Value + ) +cast state from to param = + case (compute state param) of + (BoolValue bool) -> + case to of + "string" -> + if bool + then (StringValue "true") + else (StringValue "false") + + "text" -> + if bool + then (TextValue (StringText "true")) + else (TextValue (StringText "false")) + + "bool" -> (BoolValue bool) + _ -> (unsupported_cast from to) + + (FloatValue float) -> + case to of + "string" -> (StringValue (String.fromFloat float)) + "text" -> (TextValue (StringText (String.fromFloat float))) + "int" -> (IntValue (Math.floor float)) + "float" -> (FloatValue float) + _ -> (unsupported_cast from to) + + (IntValue int) -> + case to of + "string" -> (StringValue (String.fromInt int)) + "text" -> (TextValue (StringText (String.fromInt int))) + "float" -> (FloatValue (Math.toFloat int)) + "int" -> (IntValue int) + _ -> (unsupported_cast from to) + + (TextValue text) -> + let as_string = (Tonkadur.Types.value_to_string (TextValue text)) in + case to of + "string" -> (StringValue as_string) + "float" -> + case (String.toFloat as_string) of + Nothing -> (unsupported_cast from to) + (Just result) -> (FloatValue result) + + "int" -> + case (String.toInt as_string) of + Nothing -> (unsupported_cast from to) + (Just result) -> (IntValue result) + + "text" -> (TextValue text) + _ -> (unsupported_cast from to) + + (StringValue string) -> + case to of + "string" -> (StringValue string) + "float" -> + case (String.fromFloat string) of + Nothing -> (unsupported_cast from to) + (Just result) -> (FloatValue result) + + "int" -> + case (String.toInt string) of + Nothing -> (unsupported_cast from to) + (Just result) -> (IntValue result) + + "text" -> (TextValue (StringText string)) + + _ -> (unsupported_cast from to) + + _ -> (unsupported_cast from to) + +constant : ( + Tonkadur.Types.State -> + String -> + String -> + Tonkadur.Types.Value + ) +constant state target_type as_string = + (cast state "string" target_type as_string) + +extra_computation : ( + Tonkadur.Types.State -> + String -> + (List.List Tonkadur.Types.Computation) -> + Tonkadur.Types.Value + ) +extra_computation state name parameters = + case name of + _ -> (StringValue ("Unsupported extra computation '" + name + "'")) + +if_else : ( + Tonkadur.Types.State -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Value + ) +if_else state condition if_true if_false = + if (WyrdType.to_boolean (compute state condition)) + then (compute state if_true) + else (compute state if_false) + +last_choice_index : Tonkadur.Types.State -> Tonkadur.Types.Value +last_choice_index state = (IntValue state.last_choice_index) + +newline : Tonkadur.Types.State -> Tonkadur.Types.Value +newline state = (TextValue Newline) + +next_allocable_address : Tonkadur.Types.State -> Tonkadur.Types.Value +next_allocable_address state = (IntValue state.next_allocable_address) + +operation : ( + Tonkadur.Types.State -> + String -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Value + ) +operation state name param0 param1 = + let + value0 = (compute state param0) + value1 = (compute state param1) + in + case name of + "divide" -> + case value0 of + (IntValue val) -> + (IntValue (val // (Tonkadur.Types.value_to_int value1))) + + _ -> + (FloatValue + ( + (Tonkadur.Types.value_to_float value0) + / (Tonkadur.Types.value_to_float value1) + ) + ) + + "minus" -> + case value0 of + (IntValue val) -> + (IntValue (val - (Tonkadur.Types.value_to_int value1))) + + _ -> + (FloatValue + ( + (Tonkadur.Types.value_to_float value0) + - (Tonkadur.Types.value_to_float value1) + ) + ) + + "modulo" -> + (IntValue + (modBy + (Tonkadur.Types.value_to_int value0) + (Tonkadur.Types.value_to_int value1) + ) + ) + + "plus" -> + case value0 of + (IntValue val) -> + (IntValue (val + (Tonkadur.Types.value_to_int value1))) + + _ -> + (FloatValue + ( + (Tonkadur.Types.value_to_float value0) + + (Tonkadur.Types.value_to_float value1) + ) + ) + + "power" -> + case value0 of + (IntValue val) -> + (IntValue (val ^ (Tonkadur.Types.value_to_int value1))) + + _ -> + (FloatValue + ( + (Tonkadur.Types.value_to_float value0) + ^ (Tonkadur.Types.value_to_float value1) + ) + ) + + "times" -> + case value0 of + (IntValue val) -> + (IntValue (val * (Tonkadur.Types.value_to_int value1))) + + _ -> + (FloatValue + ( + (Tonkadur.Types.value_to_float value0) + * (Tonkadur.Types.value_to_float value1) + ) + ) + + "and" -> + (BoolValue + (and + (Tonkadur.Types.value_to_bool value0) + (Tonkadur.Types.value_to_bool value1) + ) + ) + + "not" -> (BoolValue (not (Tonkadur.Types.value_to_bool value0))) + + "less_than" -> + case value0 of + (BoolValue bool) -> + (and (Tonkadur.Types.value_to_bool value1) (not boot)) + + (FloatValue float) -> + (BoolValue (float < (Tonkadur.Types.value_to_float value1))) + + (IntValue int) -> + (BoolValue (int < (Tonkadur.Types.value_to_int value1))) + + (StringValue str) -> + (BoolValue (str < (Tonkadur.Types.value_to_string value1))) + + (PointerValue ptr) -> + (BoolValue + ( + (Tonkadur.Types.compare_pointers + ptr + (Tonadur.Wyrd.value_to_dict value1) + ) + > 0 + ) + ) + + "equals" -> (value0 == value1) + +relative_address : ( + Tonkadur.Types.State -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Value + ) +relative_address state base extra = + (PointerValue + (List.append + (Tonkadur.Types.value_to_list (compute state base)) + (Tonkadur.Types.value_to_list (compute state extra)) + ) + ) + +size : ( + Tonkadur.Types.State -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Value + ) +size state computation = + (IntValue + (Dict.size (Tonkadur.Types.value_to_dict (compute state computation))) + ) + + +text : ( + Tonkadur.Types.State -> + (List.List Tonkadur.Types.Computation) -> + Tonkadur.Types.Value + ) +text state content = + (List.foldl + (\addition result -> + (TextValue + (Tonkadur.Types.append_text_content + (Tonkadur.Types.value_to_text result) + (Tonkadur.Types.value_to_text (compute state addition)) + ) + ) + ) + (TextValue (Tonkadur.Types.default_text_data)) + content + ) + +value_of : ( + Tonkadur.Types.State -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Value + ) +value_of state computation = + (List.foldl + (\next_step object -> + case (Dict.get next_step (Tonkadur.Types.value_to_dict object)) of + Nothing -> (StringValue "Segmentation Fault (incorrect address)") + (Just value) -> value + ) + (StructureValue state.memory) + (Tonkadur.Types.value_to_list (compute state computation)) + ) + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +compute : ( + Tonkadur.Types.State -> + Tonkadur.Types.Computation -> + Tonkadur.Types.Value + ) +compute state computation = + case computation of + (AddTextEffect effect_name effect_parameters content) -> + (add_text_effect state effect_name effect_parameters content) + + (Address param) -> (address state param) + (Cast from to value) -> (cast state from to value) + (Constant true_type as_string) -> (constant state true_type as_string) + (ExtraComputation name parameters) -> + (extra_computation state name parameters) + + (IfElse condition if_true if_false) -> + (if_else state condition if_true if_false) + + LastChoiceIndex -> (last_choice_index state) + Newline -> (newline state) + NextAllocableAddress -> (next_allocable_address state) + (Operation name arg_0 arg_1) -> (operation state name arg_0 arg_1) + (RelativeAddress base extra) -> (relative_address state base extra) + (Size value) -> (size state value) + (Text content) -> (text state content) + (ValueOf address) -> (value_of state address) |