Skip to content
This repository was archived by the owner on Oct 4, 2020. It is now read-only.
This repository was archived by the owner on Oct 4, 2020. It is now read-only.

Creating maps from (homogeneous) records #125

Open
@sharkdp

Description

@sharkdp

I thought it would be nice if we could use record-syntax to create Maps. Using the new RowToList mechanism, we can now turn this:

numbers  Map String Number
numbers = fromFoldable
  [ Tuple "pi" 3.14159
  , Tuple "e" 2.71828
  , Tuple "ultimate_answer" 42.0
  , Tuple "alpha" 0.00729735
  ]

into this:

numbers  Map String Number
numbers = fromRecord
  { pi: 3.14159
  , e: 2.71828
  , ultimate_answer: 42.0
  , alpha: 0.00729735
  }

The implementation could look like this:

class HomogeneousRecord (row ∷ # Type) (listRowList) a | list  row
  where
    toMap  RLProxy list  Record row  Map String a

instance homogeneousRecordNilHomogeneousRecord () Nil a where
  toMap _ _ = empty

instance homogeneousRecordCons ∷
  ( RowToList row list
  , IsSymbol l
  , RowLacks l row'
  , RowCons l a row' row
  , RowToList row' list'
  , HomogeneousRecord row' list' a
  )
   HomogeneousRecord row (Cons l a list') a where
  toMap _ record = insert key value (toMap (RLProxy  RLProxy list') record')
    where
      keyS = SProxy  SProxy l
      key = reflectSymbol keyS
      value = R.get keyS record
      record' :: Record row'
      record' = R.delete keyS record

fromRecord   row list a
           . RowToList row list
            HomogeneousRecord row list a
            Record row
            Map String a
fromRecord = toMap (RLProxy :: RLProxy list)

Calling fromRecord with a heterogeneous record leads to a compile-time error, as expected.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions