diff options
author | Nadrieril | 2020-11-03 23:31:37 +0000 |
---|---|---|
committer | GitHub | 2020-11-03 23:31:37 +0000 |
commit | 51b40c6e36a0aad28ffb44debf84cba4c7028680 (patch) | |
tree | 4585a98c7ef97a3b3afa1934a9d184cfb89040d1 /dhall/src/semantics/nze/lazy.rs | |
parent | 71c8e889610b8b9bb6155c20ca91bac4ebc9daee (diff) | |
parent | ecc5242463308c16f38dbd5015b9f264f990b76a (diff) |
Merge pull request #196 from Nadrieril/allow-mutation-in-normalization
Diffstat (limited to 'dhall/src/semantics/nze/lazy.rs')
-rw-r--r-- | dhall/src/semantics/nze/lazy.rs | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/dhall/src/semantics/nze/lazy.rs b/dhall/src/semantics/nze/lazy.rs index d361313..d3b5c8d 100644 --- a/dhall/src/semantics/nze/lazy.rs +++ b/dhall/src/semantics/nze/lazy.rs @@ -35,6 +35,22 @@ where let _ = lazy.tgt.set(tgt); lazy } + + pub fn force(&self) -> &Tgt { + self.tgt.get_or_init(|| { + let src = self.src.take().unwrap(); + src.eval() + }) + } + + pub fn get_mut(&mut self) -> &mut Tgt { + self.force(); + self.tgt.get_mut().unwrap() + } + pub fn into_inner(self) -> Tgt { + self.force(); + self.tgt.into_inner().unwrap() + } } impl<Src, Tgt> Deref for Lazy<Src, Tgt> @@ -43,10 +59,18 @@ where { type Target = Tgt; fn deref(&self) -> &Self::Target { - self.tgt.get_or_init(|| { - let src = self.src.take().unwrap(); - src.eval() - }) + self.force() + } +} + +/// This implementation evaluates before cloning, because we can't clone the contents of a `Cell`. +impl<Src, Tgt> Clone for Lazy<Src, Tgt> +where + Src: Eval<Tgt>, + Tgt: Clone, +{ + fn clone(&self) -> Self { + Self::new_completed(self.force().clone()) } } |