// A generic ADT and generic functions instantiated with several types.
import std.io.println;
import std.text.number;
type Maybe<T> = | Nothing | Just of T;
type Pair<A, B> = { first: A, second: B };
def value_or<T>(value: Maybe<T>, fallback: T): T {
match value with
| Maybe.Nothing -> { return fallback; }
| Maybe.Just(item) -> { return item; };
}
def flip<A, B>(pair: &Pair<A, B>): Pair<B, A> {
let result_pair: Pair<B, A> = { first: clone(&(*pair).second), second: clone(&(*pair).first) };
return result_pair;
}
def main(): int {
let present: Maybe<int> = Maybe.Just(42);
let missing: Maybe<int> = Maybe.Nothing();
let word: Maybe<string> = Maybe.Just("generic");
println(int_to_text(value_or(present, 0)));
println(int_to_text(value_or(missing, -1)));
println(value_or(word, "none"));
let pair: Pair<int, bool> = { first: 7, second: true };
let swapped: Pair<bool, int> = flip(&pair);
if (swapped.first) { println(int_to_text(swapped.second)); };
return 0;
}// نوع جبري عام ودوال عامة تُستخدم مع عدة أنواع.
استورد std.io.println;
استورد std.text.number;
نوع ربما<ق> = | لا_قيمة | قيمة بنوع ق;
نوع زوج<ن, م> = { الأول: ن, الثاني: م };
عرف القيمة_أو<ق>(القيمة: ربما<ق>, البديل: ق): ق {
طابق القيمة مع
| ربما.لا_قيمة -> { أرجع البديل; }
| ربما.قيمة(العنصر) -> { أرجع العنصر; };
}
عرف اقلب<ن, م>(الزوج: &زوج<ن, م>): زوج<م, ن> {
دع الزوج_الناتج: زوج<م, ن> = { الأول: استنسخ(&(*الزوج).الثاني), الثاني: استنسخ(&(*الزوج).الأول) };
أرجع الزوج_الناتج;
}
عرف الرئيسية(): عدد {
دع الموجود: ربما<عدد> = ربما.قيمة(42);
دع المفقود: ربما<عدد> = ربما.لا_قيمة();
دع الكلمة: ربما<نص> = ربما.قيمة("عام");
اطبع_سطر(عدد_إلى_نص(القيمة_أو(الموجود, 0)));
اطبع_سطر(عدد_إلى_نص(القيمة_أو(المفقود, -1)));
اطبع_سطر(القيمة_أو(الكلمة, "لا شيء"));
دع الزوج: زوج<عدد, منطقي> = { الأول: 7, الثاني: صواب };
دع المقلوب: زوج<منطقي, عدد> = اقلب(&الزوج);
إذا (المقلوب.الأول) { اطبع_سطر(عدد_إلى_نص(المقلوب.الثاني)); };
أرجع 0;
}
Run it
With the interpreter, without compiling:
./build/sultanc run examples/en/generics/maybe.snOr compile it to an executable:
./build/sultanc examples/en/generics/maybe.sn -o build/example && ./build/example