Skip to content

werediver/sum_types.dart

Folders and files

NameName
Last commit message
Last commit date
Nov 6, 2024
Nov 6, 2024
Nov 6, 2024
Nov 6, 2024
Aug 19, 2019
Jul 11, 2022
Nov 6, 2024
Sep 7, 2019
Jun 23, 2021
Nov 6, 2024
Jul 11, 2022
Nov 6, 2024

Repository files navigation

Build Status sum_types version sum_types_generator version

sum_types and sum_types_generator

sum_types and sum_types_generator packages together define a code generator enabling sum-types in Dart.

NOTE: v0.2.0 is a major update with backward-incompatible changes.

Example

In example/lib/src/ you can find a few sum-type declarations and the code generated for them.

This one models the natural numbers (with zero):

import 'package:meta/meta.dart';
import 'package:sum_types/sum_types.dart';

@SumType()
class Nat extends _$Nat {
  const Nat.zero() : super(zero: const Unit());
  const Nat.next(Nat value) : super(next: value);

  Nat operator +(Nat other) => this.iswitch(
        zero: () => other,
        next: (next) => Nat.next(next + other),
      );

  int toInt() => this.iswitch(
        zero: () => 0,
        next: (next) => 1 + next.toInt(),
      );
}

Features

Core:

  • Const case-constructors (const Nat.zero())
  • Extensible sum-types (Nat.toInt())
  • Nested sum-types
  • Recursive sum-types (Case<_Nat>(name: "next")Nat.next(Nat.zero()))
  • Generic sum-types (Either<Left, Right>)
  • Exhaustive in-line iswitch
  • Inexhaustive in-line iswitcho (with otherwise: case)

Sugar:

  • No-payload cases (Case<void>(name: "zero")Nat.zero())
  • Default case-names (Case<String>()JSON.string("some"))

Trivia:

  • Equality test
  • Hash function
  • To string conversion

Serialization-deserialization support through product-types interoperability:

  • Deserialization support (NatRecord<Self>, Nat.load<T extends NatRecord<T>>(T rec))
  • Serialization support (Nat.dump<T>(T Function({Unit zero, T next} make)))

Development

Find the upcoming development plans in the project planner.