<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    I'm not the person to ask :) Maybe someone else on the list can chip
    in here.<br>
    <br>
    Another question if you don't mind (I'm learning here): you say
    below that in <a id="v:atomicModifyIORef2Native" class="def">atomicModifyIORef2Native,</a>
    you rely on heap object layout to unsafeCoerce between a pair and
    any object with an interesting value in the first field. But looking
    at the source [1], it seems you only do this for base < 4.13,
    i.e. GHC < 8.8.4. That's been a while.<br>
    <br>
    Is it true that for GHCs since 8.8.4 you can just use a primop to do
    what you want directly, without the magic Generic stuff? If so,
    perhaps you can even drop the Generic constraints for high enough
    GHC versions (by extending the scope of the CPP slightly)? 8.6.5 is
    still popular, but simultaneously a whole bunch of applications
    don't care about GHCs <9 anymore.<br>
    <br>
    - Tom<br>
    <br>
    [1]:
<a class="moz-txt-link-freetext" href="https://hackage.haskell.org/package/atomic-modify-general-0.1.0.0/docs/src/Data.IORef.AtomicModify.Generic.html#atomicModifyIORef2Native">https://hackage.haskell.org/package/atomic-modify-general-0.1.0.0/docs/src/Data.IORef.AtomicModify.Generic.html#atomicModifyIORef2Native</a><br>
    <br>
    <div class="moz-cite-prefix">On 10/03/2023 09:45, David Feuer wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAMgWh9svyCMosmMU0-esPVRfqoKKVz0wmm_KuM3t_8c6v77-pA@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="auto">Whoops! Thanks for pointing that out. I'll fix it
        and push new docs. There's not much magic in that part of the
        code itself; the nasty magic is knowing that the first pointer
        in any record is in the same position in its heap object as the
        first component of a pair. Speaking of which, do you have any
        idea if it'll work for non-record types whose constructors all
        have the same first field? I'm guessing yes, but I haven't
        experimented yet.</div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Fri, Mar 10, 2023, 3:27 AM
          Tom Smeding <<a href="mailto:x@tomsmeding.com"
            moz-do-not-send="true" class="moz-txt-link-freetext">x@tomsmeding.com</a>>
          wrote:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0 0 0
          .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi David,<br>
          <br>
          Fancy stuffs!<br>
          <br>
          Wondering how much magic was going on in implementing this, I
          saw that <br>
          atomicModifyIORef2Native misses the haddock marker '|' in the
          source; <br>
          thus your extensive doc comment doesn't show up on hackage.<br>
          <br>
          Cheers,<br>
          Tom<br>
          <br>
          On 10/03/2023 03:01, David Feuer wrote:<br>
          > I just put together a new package, atomic-modify-general,
          for<br>
          > generalizations of the `atomicModifyIORef` operation. In
          particular:<br>
          ><br>
          > 1. Versions that allow a result of an arbitrary type (not
          necessarily<br>
          > a pair), where the caller passes in an extraction
          function. These work<br>
          > with `Array` and `SmallArray` from `primitive` as well as
          `IORef`.<br>
          > 2. A version that works with record types (not just
          pairs) whose first<br>
          > field is the new value to install in the `IORef`. This
          uses<br>
          > implementation details of the `atomicModifyMutVar#`
          primop as well as<br>
          > GHC's heap object layout to achieve better performance.<br>
          ><br>
          > Please try it out and let me know how it goes, and what
          extras you may want!<br>
          ><br>
          > Hackage: <a
            href="https://hackage.haskell.org/package/atomic-modify-general-0.1.0.0"
            rel="noreferrer noreferrer" target="_blank"
            moz-do-not-send="true" class="moz-txt-link-freetext">https://hackage.haskell.org/package/atomic-modify-general-0.1.0.0</a><br>
          > _______________________________________________<br>
          > Haskell-Cafe mailing list<br>
          > To (un)subscribe, modify options or view archives go to:<br>
          > <a
            href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe"
            rel="noreferrer noreferrer" target="_blank"
            moz-do-not-send="true" class="moz-txt-link-freetext">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
          > Only members subscribed via the mailman list are allowed
          to post.<br>
          <br>
          _______________________________________________<br>
          Haskell-Cafe mailing list<br>
          To (un)subscribe, modify options or view archives go to:<br>
          <a
            href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe"
            rel="noreferrer noreferrer" target="_blank"
            moz-do-not-send="true" class="moz-txt-link-freetext">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
          Only members subscribed via the mailman list are allowed to
          post.</blockquote>
      </div>
    </blockquote>
    <br>
  </body>
</html>