Creating a kaleidoscope with haskell and the diagrams DSL.
{-# LANGUAGE NoMonomorphismRestriction #-}importControl.Monad(replicateM)importControl.Monad.RandomimportData.Colour.Palette.ColorSetimportData.List(zipWith,zipWith3)importDiagrams.PreludeimportDiagrams.Backend.Rasterific.CmdLineimportSystem.RandomtypeDia=DiagramBR2iterateIdx::Integrali=>(i->a->a)->a->[a]iterateIdxft=goft0wheregofti=lett'=fitint':goft'(i+1)kaleidoscope::Dia->Double->Diakaleidoscopedy=appendshexhexswherehexs=zipdirs(replicate6hex)dirs=iterate(rotateBy(1/6))(rotateBy(1/12)unitX)hex=mconcat.take6$iterateIdxnexttritri=alignBR$mkTriangle(translateY(-y)d)nexti=reflectAbout(0^&0)(rotateBy(-fromIntegrali/6)unitX)mkTriangle::Dia->DiamkTriangle=clipped(triangle1)#lwnoneconfettiScope::Int->Int->Double->DiaconfettiScopenry=kaleidoscope(mkConfettin(mkStdGenr))y#centerXY<>(circle2.75#fcblack)#pad1.1sizeValue::(RandomGeng)=>RandgDoublesizeValue=getRandomR(0.05,0.25)coordValue::(RandomGeng)=>RandgDoublecoordValue=getRandomR(-0.5,0.5)confetti::Int->RandStdGenDiaconfettin=doss<-replicateMnsizeValue-- radiuscs<-replicateMngetRandom-- color indexas<-replicateMngetRandom-- opacityxs<-replicateMncoordValue-- x coordinateys<-replicateMncoordValue-- y coordinateletmkCirc::Double->Int->Double->DiamkCircsca=circles#fc(webColorsc)#opacityapos=zipWithmkP2xsysconf=zipWith3mkCircsscsasreturn$position(zipposconf)mkConfetti::Int->(StdGen->Dia)mkConfettin=evalRand$confettinmain=mainWithgifdias=map(confettiScope500)[-0.5,-0.49..0.5]gif::[(DiagramBR2,Int)]gif=zip(dias++reversedias)(repeat5)