style for html IDs in hamlet

In an effort to get more type-checked goodness in hamlet, I started using string constants for all my dom IDs and classes. We're not using the newIdent function because I want control over what the IDs and classes will be named. I wrote up a little typeclass as such: class CustomIdentString a where jqVal :: a -> String; idVal :: a -> String newtype CustomIdentCls = MkCls String instance CustomIdentString CustomIdentCls where jqVal (MkCls s) = "." ++ s; idVal (MkCls s) = s; newtype CustomIdentId = MkId String instance CustomIdentString CustomIdentId where jqVal (MkId s) = "#" ++ s; idVal (MkId s) = s; This way, I can refer to divs in javascript using: $("#{jqVal myId}").foo.. And create the elements in hamlet using

We could have something like
class DomId a where
toDomId :: a -> Text
class DomClass a where
toDomClass :: a -> Text
That hamlet calls on id and class insertions. Michael would no better if
that is possible with the hamlet internals.
On Fri, Apr 8, 2011 at 7:03 AM, Max Cantor
In an effort to get more type-checked goodness in hamlet, I started using string constants for all my dom IDs and classes. We're not using the newIdent function because I want control over what the IDs and classes will be named.
I wrote up a little typeclass as such:
class CustomIdentString a where jqVal :: a -> String; idVal :: a -> String
newtype CustomIdentCls = MkCls String instance CustomIdentString CustomIdentCls where jqVal (MkCls s) = "." ++ s; idVal (MkCls s) = s;
newtype CustomIdentId = MkId String instance CustomIdentString CustomIdentId where jqVal (MkId s) = "#" ++ s; idVal (MkId s) = s;
This way, I can refer to divs in javascript using: $("#{jqVal myId}").foo..
And create the elements in hamlet using
...I'm wondering is there a datatype for IDs and Classes that I can use to make the IDs and Classes directly so that:
andwould fail to typecheck?In general, are there any good, safe ways to do this instead of just unwrapping to strings?
max _______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel
10:43 a.m.New subject: style for html IDs in hamletIts not really worth changing the API, just wondering if there is a way to do it with the current API. max On Apr 8, 2011, at 10:39 PM, Greg Weber wrote:
We could have something like
class DomId a where toDomId :: a -> Text
class DomClass a where toDomClass :: a -> Text
That hamlet calls on id and class insertions. Michael would no better if that is possible with the hamlet internals.
On Fri, Apr 8, 2011 at 7:03 AM, Max Cantor
wrote: In an effort to get more type-checked goodness in hamlet, I started using string constants for all my dom IDs and classes. We're not using the newIdent function because I want control over what the IDs and classes will be named. I wrote up a little typeclass as such:
class CustomIdentString a where jqVal :: a -> String; idVal :: a -> String
newtype CustomIdentCls = MkCls String instance CustomIdentString CustomIdentCls where jqVal (MkCls s) = "." ++ s; idVal (MkCls s) = s;
newtype CustomIdentId = MkId String instance CustomIdentString CustomIdentId where jqVal (MkId s) = "#" ++ s; idVal (MkId s) = s;
This way, I can refer to divs in javascript using: $("#{jqVal myId}").foo..
And create the elements in hamlet using
...I'm wondering is there a datatype for IDs and Classes that I can use to make the IDs and Classes directly so that:
andwould fail to typecheck?In general, are there any good, safe ways to do this instead of just unwrapping to strings?
max _______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel
9 Apr 9 Apr3:04 p.m.New subject: style for html IDs in hamletOn Fri, Apr 8, 2011 at 5:03 PM, Max Cantor
wrote: In an effort to get more type-checked goodness in hamlet, I started using string constants for all my dom IDs and classes. We're not using the newIdent function because I want control over what the IDs and classes will be named.
I wrote up a little typeclass as such:
class CustomIdentString a where jqVal :: a -> String; idVal :: a -> String
newtype CustomIdentCls = MkCls String instance CustomIdentString CustomIdentCls where jqVal (MkCls s) = "." ++ s; idVal (MkCls s) = s;
newtype CustomIdentId = MkId String instance CustomIdentString CustomIdentId where jqVal (MkId s) = "#" ++ s; idVal (MkId s) = s;
This way, I can refer to divs in javascript using: $("#{jqVal myId}").foo..
And create the elements in hamlet using
...I'm wondering is there a datatype for IDs and Classes that I can use to make the IDs and Classes directly so that:
andwould fail to typecheck?In general, are there any good, safe ways to do this instead of just unwrapping to strings?
It's entirely possible to provide separate datatypes for IDs and classes at the Hamlet level. The problem is, you will either always need to use them in place of String/Text, or we'll need to have a separate typeclass for each and triple the number of instance declarations. My opinion: it's a good idea in theory, but will be more trouble than it's worth in practice. One recommendation for your existing code: instead of calling jqVal and idVal directly, declare instances of ToHtml and ToJavascript. Michael
Download5155Age (days ago)5156Last active (days ago)
3 comments3 participantsparticipants (3)
Greg Weber Max Cantor Michael Snoyman