diff --git a/bower.json b/bower.json index bbcda159..c0318f24 100644 --- a/bower.json +++ b/bower.json @@ -26,7 +26,8 @@ "purescript-lists": "^4.0.0", "purescript-st": "^3.0.0", "purescript-gen": "^1.1.0", - "purescript-foldable-traversable": "^3.6.1" + "purescript-foldable-traversable": "^3.6.1", + "purescript-typelevel-prelude": "^2.6.0" }, "devDependencies": { "purescript-quickcheck": "^4.0.0", diff --git a/src/Data/StrMap.js b/src/Data/StrMap.js index ab82f990..43196cfe 100644 --- a/src/Data/StrMap.js +++ b/src/Data/StrMap.js @@ -106,6 +106,10 @@ exports._lookupST = function (no, yes, k, m) { }; }; +exports.fromRecordImpl = function(r) { + return r; +}; + function toArrayWithKey(f) { return function (m) { var r = []; diff --git a/src/Data/StrMap.purs b/src/Data/StrMap.purs index 3b57a4a7..51ae2b0a 100644 --- a/src/Data/StrMap.purs +++ b/src/Data/StrMap.purs @@ -16,6 +16,7 @@ module Data.StrMap , toAscUnfoldable , fromFoldable , fromFoldableWith + , fromRecord , delete , pop , member @@ -46,7 +47,6 @@ import Prelude import Control.Monad.Eff (Eff, runPure, foreachE) import Control.Monad.ST as ST - import Data.Array as A import Data.Eq (class Eq1) import Data.Foldable (class Foldable, foldl, foldr, for_) @@ -60,6 +60,7 @@ import Data.Traversable (class Traversable, traverse) import Data.TraversableWithIndex (class TraversableWithIndex, traverseWithIndex) import Data.Tuple (Tuple(..), fst, uncurry) import Data.Unfoldable (class Unfoldable) +import Type.Row.Homogeneous (class Homogeneous) -- | `StrMap a` represents a map from `String`s to values of type `a`. foreign import data StrMap :: Type -> Type @@ -235,6 +236,12 @@ fromFoldableWith f l = pureST (do for_ l (\(Tuple k v) -> runFn4 _lookupST v (f v) k s >>= SM.poke s k) pure s) +-- | Create a map from a homogeneous record (all attributes have the same type). +fromRecord :: forall r t. Homogeneous r t => Record r -> StrMap t +fromRecord = fromRecordImpl + +foreign import fromRecordImpl :: forall r t. Record r -> StrMap t + foreign import toArrayWithKey :: forall a b . (String -> a -> b) -> StrMap a -> Array b -- | Unfolds a map into a list of key/value pairs diff --git a/test/Test/Data/StrMap.purs b/test/Test/Data/StrMap.purs index ae4ba00d..8e072fca 100644 --- a/test/Test/Data/StrMap.purs +++ b/test/Test/Data/StrMap.purs @@ -160,6 +160,10 @@ strMapTests = do quickCheck (M.lookup "1" nums == Just 2 <?> "invalid lookup - 1") quickCheck (M.lookup "2" nums == Nothing <?> "invalid lookup - 2") + log "fromRecord" + quickCheck (M.fromRecord {a: 1, b: 2, c: 3} + == M.fromFoldable [Tuple "a" 1, Tuple "b" 2, Tuple "c" 3]) + log "toUnfoldable . fromFoldable = id" quickCheck $ \arr -> let f x = M.toUnfoldable (M.fromFoldable x) in f (f arr) == f (arr :: L.List (Tuple String Int)) <?> show arr