Как использовать вяз-монокль с типом суммы? - PullRequest
1 голос
/ 13 июля 2020

Как мне написать линзу, которая обращается к полю внутри записи, которое само находится внутри типа суммы?

У меня есть такая модель:

type alias Coords =
  { x : Maybe String
  , y : Maybe String
  }

type alias Foo =
  { coords : Maybe Coords
  }

type alias Bar =
  { coords : Maybe Coords
  }

type Thing = FooThing Foo | BarThing Bar

type alias Model =
  { thing : Maybe Thing
  }

Я знаю, что Я могу получить доступ к Thing внутри Model с помощью

thingLens : Optional Model Thing
thingLens = Optional .thing (\b a -> { a | thing = Just b })

... и я считаю, что могу получить x от Foo с помощью

xFromFoo : Optional Thing String
xFromFoo = Optional .x (\b a -> { a | x = b })

... но как мне их составить? Я хочу go из Model в x внутри Foo.

1 Ответ

1 голос
/ 14 июля 2020

После некоторых экспериментов я пришел к следующему, который работает:

thingL : Optional Model Thing
thingL = Optional .thing (\b a -> { a | thing = Just b })

thingFooCoordsL : Optional Thing Coords
thingFooCoordsL =
  let get a = case a of
        FooThing f -> f.coords
        _ -> Nothing
      set val thing = case thing of
        FooThing f ->
          FooThing { f | coords = Just val }
        a -> a
   in Optional get set

coordsXL : Optional Coords String
coordsXL = Optional .x (\b a -> { a | x = Just b })

fooThingCoordsXL : Optional Model Title
fooThingCoordsXL = thingL
  |> Monocle.Compose.optionalWithOptional thingFooCoordsL
  |> Monocle.Compose.optionalWithOptional coordsXL

В основном вам нужна линза, которая обертывает и разворачивает типы суммы, и вам нужны разные линзы для каждого конструктора суммы введите ваш wi sh для доступа.

...