public static ListMonad <T> ToListMonad <T>(this Monad <T> value) { ListMonad <T> result = new ListMonad <T>(); foreach (T element in value) { result.Add(element); } return(result); }
public override Monad <B> Fmap <B>(Func <CacheEntry <K, V>, B> function) { ListMonad <B> result = new ListMonad <B>(); Lock.EnterWriteLock(); try { foreach (var element in cacheDict) { result.Add(function(element.Value)); } } finally { Lock.ExitWriteLock(); } return(result); }
public override Monad <C> Com <B, C>(Func <CacheEntry <K, V>, B, C> function, Monad <B> mOther) { ListMonad <C> result = new ListMonad <C>(); Lock.EnterWriteLock(); try { foreach (var element in cacheDict.Values) { foreach (var elementB in mOther) { result.Add(function(element, elementB)); } } } finally { Lock.ExitWriteLock(); } return(result); }
public override Monad <B> App <B>(Monad <Func <CacheEntry <K, V>, B> > functionMonad) { ListMonad <B> result = new ListMonad <B>(); Lock.EnterWriteLock(); try { foreach (var element in cacheDict.Values) { foreach (var func in functionMonad) { result.Add(func(element)); } } } finally { Lock.ExitWriteLock(); } return(result); }
public override Monad <B> Bind <B>(Func <CacheEntry <K, V>, Monad <B> > func) { ListMonad <B> result = new ListMonad <B>(); Lock.EnterWriteLock(); try { foreach (var element in cacheDict.Values) { foreach (var fRes in func(element)) { result.Add(fRes); } } } finally { Lock.ExitWriteLock(); } return(result); }