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