While playing with safe-money library, I've realized that we don't need to commit on TypeLits and type level onlyStorePath and we can have both variants and couple of utility functions to turn one into other when/if needed.
I've quickly drafted the following (quite similar to Dense and SomeDense from safe-money + some questionable field duplication) and it looks plausible. After it compiled I went and checked prior implementation by @shlevy and it's quite similar, with the difference that this allows SomeStorePaths when we don't know/care about store root.
data StorePath = StorePath
{ -- | The 160-bit hash digest reflecting the "address" of the name.
-- Currently, this is a truncated SHA256 hash.
storePathHash :: !(Digest StorePathHashAlgo)
, -- | The (typically human readable) name of the path. For packages
-- this is typically the package name and version (e.g.
-- hello-1.2.3).
storePathName :: !StorePathName
}
deriving (Eq, Ord)
newtype SymbolicStorePath (root :: Symbol) = SymbolicStorePath StorePath
deriving (Eq, Ord)
data SomeStorePath = SomeStorePath {
someStorePathHash :: !(Digest StorePathHashAlgo)
, -- | The (typically human readable) name of the path. For packages
-- this is typically the package name and version (e.g.
-- hello-1.2.3).
someStorePathName :: !StorePathName
, -- | Root of the store
someStorePathRoot :: !FilePath
} deriving (Eq, Ord)
fromSomePath
:: forall root
. KnownSymbol root
=> SomeStorePath
-> Maybe (SymbolicStorePath root)
fromSomePath SomeStorePath{..} =
if (someStorePathRoot == symbolVal @root Proxy)
then Just $ SymbolicStorePath $ StorePath { storePathHash = someStorePathHash, storePathName = someStorePathName }
else Nothing
withSomePath
:: SomeStorePath
-> (forall root. KnownSymbol root => SymbolicStorePath root -> a)
-> a
While playing with
safe-money
library, I've realized that we don't need to commit onTypeLits
and type level onlyStorePath
and we can have both variants and couple of utility functions to turn one into other when/if needed.I've quickly drafted the following (quite similar to
Dense
andSomeDense
fromsafe-money
+ some questionable field duplication) and it looks plausible. After it compiled I went and checked prior implementation by @shlevy and it's quite similar, with the difference that this allowsSomeStorePaths
when we don't know/care about store root.