Как concatMap для всех пар ключ / значение в Aeson.Object с использованием линз - PullRequest
0 голосов
/ 28 сентября 2018

Я дурачился с комбинаторами в Control.Lens.Indexed, особенно iconcatMap, но я не смог придумать функцию со следующим type-sigс использованием объектива Data.Aeson.Lens.members:

func 

  -- list of key/value pairs, essentially
  :: Aeson.Object                  

  -- function for the concatMap operation to which the 
  -- key (Text) and value is passed
  -> (Text -> Aeson.Value -> [a])  

  -- resultant concatenated list
  -> [a]

1 Ответ

0 голосов
/ 28 сентября 2018

Желаемая функция: iconcatMapOf.Также обратите внимание, что members перебирает типы с экземпляром AsValue, и такого экземпляра для Object нет, поэтому нам нужно обернуть его в Value.

import qualified Data.Aeson as Aeson
import Control.Lens
import Data.Aeson.Lens
import Data.Text

func :: Aeson.Object -> (Text -> Aeson.Value -> [a]) -> [a]
func obj f = iconcatMapOf members f (Aeson.Object obj)
...