module Data.Rivers.Idiom where

import Prelude (($))
class Idiom f where
     pure      ::    a             -> f a
     srepeat   ::    a             -> f a     
     (<>)      :: f (a -> b)       -> f a -> f b
     smap      ::   (a -> b)       -> f a -> f b
     zip       ::   (a -> b -> c)  -> f a -> f b -> f c

     pure      = srepeat
     (<>)      = zip ($)
     srepeat   = pure 
     smap f s  = pure f <> s
     zip g s t = pure g <> s <> t