Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program MaybeMonad;
- {$APPTYPE CONSOLE}
- {$I Spring.inc}
- uses
- Spring,
- Spring.Collections,
- SysUtils,
- TypInfo;
- type
- Maybe<T> = record
- strict private
- fValues: TArray<T>;
- public
- constructor Create(const value: T);
- function Get: IEnumerable<T>;
- function GetEnumerator: IEnumerator<T>;
- class operator Implicit(const value: Maybe<T>): IEnumerable<T>;
- class operator Implicit(const value: T): Maybe<T>;
- end;
- constructor Maybe<T>.Create(const value: T);
- begin
- case {$IFDEF DELPHIXE7_UP}System.GetTypeKind(T){$ELSE}GetTypeKind(TypeInfo(T)){$ENDIF} of
- tkClass, tkArray, tkInterface, tkDynArray, tkClassRef, tkPointer, tkProcedure:
- if (PPointer(@value)^ = nil) then
- Exit;
- end;
- SetLength(fValues, 1);
- fValues[0] := value;
- end;
- function Maybe<T>.Get: IEnumerable<T>;
- begin
- Result := Self;
- end;
- function Maybe<T>.GetEnumerator: IEnumerator<T>;
- begin
- Result := IEnumerable<T>(Self).GetEnumerator;
- end;
- class operator Maybe<T>.Implicit(const value: Maybe<T>): IEnumerable<T>;
- begin
- Result := TEnumerable.Query<T>(value.fValues);
- end;
- class operator Maybe<T>.Implicit(const value: T): Maybe<T>;
- begin
- Result := Maybe<T>.Create(value);
- end;
- function Divide(const x, y: Integer): Maybe<Integer>;
- begin
- if y <> 0 then
- Result := x div y;
- end;
- function DoSomeDivision(denominator: Integer): Maybe<Integer>;
- var
- a, b: Integer;
- begin
- for a in Divide(42, denominator) do
- for b in Divide(a, 2) do
- Result := b;
- end;
- var
- a: string;
- b: Integer;
- c: TDateTime;
- result: Maybe<string>;
- begin
- try
- for a in TArray<string>.Create('Hello World!') do
- for b in DoSomeDivision(0) do
- for c in TArray<TDateTime>.Create(EncodeDate(2010, 1, 14)) do
- result := a + ' ' + IntToStr(b) + ' ' + DateTimeToStr(c);
- Writeln(result.Get.FirstOrDefault('Nothing'));
- except
- on E: Exception do
- Writeln(E.ClassName, ': ', E.Message);
- end;
- Readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement