Cool stuff. I’d note that both `length xs` and `xs !! x` are O(n), so that makes `toPattern :: [a] -> Pattern a` O(n^2), but it doesn’t have to be. You can look the length up once, and use `zipWith` to iterate through your elements
instance Patternable [] where
toPattern xs = Cycle ps
where
n = length xs
ps = zipWith mkArc xs [0..]
mkArc x i = Arc x ((fromIntegral i) / (fromIntegral n)) Nothing

]]>