Code Monkey home page Code Monkey logo

Comments (5)

chadunit avatar chadunit commented on August 20, 2024 1

Given that IHTMLProp has the same "problem", I was wondering if there was any thought given to removing the interfaces altogether and combining HTMLAttr+DOMAttr+Prop into one big DU so it could also have a homogeneous list type. Maybe other downsides though.

Anyway I made a computation expression to coerce the yielded types so I'm not even that bothered by this anymore. It's more syntax up front but better than casting every yield IMO. It's a suitable workaround for me so it's fine if we want to close this and not mess with it for now.

type CompatibleList<'a>() =
  member x.Yield(item:'a) : 'a list = List.singleton item
  member x.YieldFrom(expr:'a list) : 'a list = expr
  member x.Combine(left:'a list, right:'a list) : 'a list = List.append left right
  member x.Delay(fn:unit -> 'a list) : 'a list = fn()
  member x.Zero() : 'a list = List.empty<'a>
  member x.For(expr:'b seq, fn:'b -> 'a list) : 'a list = expr |> Seq.toList |> List.collect fn

let cssprops = CompatibleList<ICSSProp>()
let htmlprops = CompatibleList<IHTMLProp>()

let view model =
  div <| htmlprops {
    yield Id "view"
    yield Style <| cssprops {
      yield Margin 0
      yield Padding 0
    }
  } <| [
    span [] [ str "hello" ]
  ]

from fable-react.

alfonsogarciacaro avatar alfonsogarciacaro commented on August 20, 2024

There MUST be a reason... I just don't remember what it is, let me check 😅 BTW, you can use upcast instead of unbox, which is type safe and it'll be also erased in JS code. But I acknowledge it's still annoying.

from fable-react.

chadunit avatar chadunit commented on August 20, 2024

Ah, thanks for type-safe upcast tip, that's a little better since I'm adding the yields anyway and don't have to repeat the type. Plus it also works with e.g. IHTMLProp list. 👍 I guess ICSSProp was probably modeled like IHTMLProp but ended up with only one implementer.

from fable-react.

alfonsogarciacaro avatar alfonsogarciacaro commented on August 20, 2024

Your guess is probably right. I had a look at the source and I don't remember why I exactly did it like that 😅

Maybe it was a simpler way to solve the top-down order in F#, but we can use module rec or and for that. I'm ok with removing ICSSProp 👍

from fable-react.

alfonsogarciacaro avatar alfonsogarciacaro commented on August 20, 2024

IIRC DOMAttr and HTMLAttr had to be separated because SVG elements accept the former but not the latter.

from fable-react.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.