<div dir="auto">If you're playing around with these ideas, you may appreciate the coercible-utils package[*]. I basically rewrote the package last year to get really good type inference at the cost of some (hard to use) flexibility.<div dir="auto"><br></div><div dir="auto">[*] <a href="https://hackage.haskell.org/package/coercible-utils">https://hackage.haskell.org/package/coercible-utils</a><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 10, 2020, 8:23 AM Hécate <<a href="mailto:hecate@glitchbra.in">hecate@glitchbra.in</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  

    
  
  <div>
    <p>Hello, CLC and haskell-libraries,<br>
      <br>
      I am opening a proposal process to consider the integration of
      several helper functions in `base`, operating on Newtypes, and all
      based on `coerce`.<br>
      <br>
      My motivations are that we ought to provide a minimum set of tools
      in order to work effectively with one of our most beloved and
      ubiquitous language features.<br>
      <br>
      Now, these functions that I am about to present to you all do not
      come out of nowhere. They have been integrated to Kowainik's
      alternative prelude "Relude", and seem<br>
      to have found their use amongst their users, me included.<br>
      Their documentation can be found here =>
<a href="https://hackage.haskell.org/package/relude-0.7.0.0/docs/Relude-Extra-Newtype.html" target="_blank" rel="noreferrer">https://hackage.haskell.org/package/relude-0.7.0.0/docs/Relude-Extra-Newtype.html</a>
      <br>
      but I am reproducing them below for convenience:<br>
      <br>
      ---<br>
      <a id="m_4016565528343698598v:un" rel="noreferrer">un :: forall a n. Coercible a n => n
        -> a<br>
        <br>
        Unwraps value from newtype.<br>
        <br>
        ```<br>
        >>> newtype Size = Size Int deriving Show<br>
        >>> un @Int (Size 5)<br>
        5<br>
        >>> un (Size 5) == length ['a', 'x', 'b']<br>
        False<br>
        ```<br>
        <br>
      </a>---<br>
      wrap :: forall n a. Coercible a n => a -> n <br>
      <br>
      Wraps value to newtype. Behaves exactly as 'un' but has more
      meaningful name in case you need to convert some value to newtype.<br>
      <br>
      ```<br>
      >>> newtype Flag = Flag Bool deriving (Show, Eq)<br>
      >>> wrap False == Flag True<br>
      False<br>
      ```<br>
    </p>
    <p>---<br>
      under :: forall n a. Coercible a n => (n -> n) -> a ->
      a<br>
      <br>
      Applies function to the content of newtype. This function is not
      supposed to be used on newtypes that are created with the help of
      smart constructors.<br>
      <br>
      ```<br>
      >>> newtype Foo = Foo Bool deriving Show<br>
      >>> under not (Foo True)<br>
      Foo False<br>
      >>> newtype Bar = Bar String deriving Show<br>
      >>> under (filter (== 'a')) (Bar "abacaba")<br>
      Bar "aaaa"<br>
      ```<br>
      <br>
      As well as the coerced composition operator:<br>
      <br>
      (#.) :: Coercible b c => (b -> c) -> (a -> b) -> (a
      -> c)<br>
      (#.) _f = coerce<br>
      {-# INLINE (#.) #-}<br>
      <br>
      Which currently lives in
<a href="https://hackage.haskell.org/package/base-4.14.0.0/docs/src/Data.Functor.Utils.html#%23" target="_blank" rel="noreferrer">https://hackage.haskell.org/package/base-4.14.0.0/docs/src/Data.Functor.Utils.html#%23</a>
      but is not exported.<br>
      <br>
      <br>
      Regarding the location of these functions, I either see them
      living in their own "Data.Newtype", or they could join
      Data.Coerce.<br>
      I would personally create a new module as to avoid "polluting"
      Data.Coerce with non-class functions, but this is my personal
      preference.<br>
      <br>
      <br>
      Thank you for reading.<br>
      <br>
    </p>
    <pre cols="72">-- 
Hécate ✨
🐦: @TechnoEmpress
IRC: Uniaika
WWW: <a href="https://glitchbra.in" target="_blank" rel="noreferrer">https://glitchbra.in</a>
RUN: BSD</pre>
  </div>

_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" target="_blank" rel="noreferrer">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div>