Templates and unaryFun!
ddcovery
antoniocabreraperez at gmail.com
Thu Sep 24 11:15:11 UTC 2020
Last week, in general forum someone introduced the possibility to
implement the .? operator in D:
https://forum.dlang.org/thread/blnjoaleswqnaojoulzp@forum.dlang.org
I decided to implement a simple solution with a funciontal syntax:
> string fatherName =
> dot(person).dot(a=>a.father).dot(a=>a.name).get("unknown");
> Person grandFather =
> dot(person).dot(a=>a.father).dot(a=>a.father).get;
That are equivalent to (dart code)
> String fatherName = person?.father?.name??"unknown"
> Person grandFather = person?.father?.father
The code is
> auto dot(T)(T t){ return Dot!T(t); }
>
> struct Dot(T) {
> private Nullable!T value; // = Nullable!T.init;
>
> this (T v)
> {
> static if(isAssignable!(T, typeof(null) ))
> {
> if(v !is null){
> value = nullable(v);
> }
> } else {
> value = nullable(v);
> }
> }
>
> template dot(R)
> {
> Dot!R dot( R function(T) fun)
> {
> static assert(!isAssignable!(typeof(null), R), "Sorry, f
> returning type can't be typeof(null)");
> return value.isNull() ?
> Dot!R() :
> Dot!R(fun(value.get()));
> }
> }
> }
> T get(T defaultValue)
> {
> return this.value.get(defaultValue);
> }
>
> static if(isAssignable!(T, typeof(null) ))
> {
> T get()
> {
> return this.value.isNull ? null : this.value.get;
> }
> }
> }
I tried to adapt to template syntax (as a syntax sugar):
> auto name = dot(person).dt!"a.father".dt!"a.father".get;
but I have not succeeded
Example: I tried with a global function
> Dot!R dt(alias fun, T, R)(Dot!T t){
> auto f = cast(R function(T)) unaryFun!fun;
> return t.dot!R(f);
> }
I really need to investigate more about unaryFun! :-)
I will appreciate any idea/guidance
Thank you!!!
More information about the Digitalmars-d-learn
mailing list