somme ex2 and ex3 text
[tt2015.git] / a3 / code / Generics / GenFMap.icl
diff --git a/a3/code/Generics/GenFMap.icl b/a3/code/Generics/GenFMap.icl
deleted file mode 100644 (file)
index 14b171f..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-implementation module GenFMap \r
-\r
-import StdGeneric, StdEnv, StdMaybe, _Array, GenMonad\r
-\r
-derive bimap (,), [] \r
-\r
-:: FMap v \r
-       = FMEmpty\r
-       | FMValue v\r
-       | FMEither      .(FMap v) .(FMap v)\r
-       | FMChar .[.(Char, .FMap v)]\r
-       | FMInt  .[.(Int, .FMap v)]\r
-       | FMReal .[.(Real, .FMap v)]\r
-\r
-emptyFMap :: .FMap .v\r
-emptyFMap = FMEmpty\r
-\r
-lookupAssocList :: k v [(k,v)] -> v | == k\r
-lookupAssocList key default_val [] = default_val\r
-lookupAssocList key default_val [(k,v):xs]\r
-       | key == k\r
-               = v\r
-               = lookupAssocList key default_val xs \r
-               \r
-updateAssocList :: k v v [(k,v)] -> (v, [(k,v)]) | == k\r
-updateAssocList key value default_val [] = (default_val, [(key, value)])\r
-updateAssocList key value default_val [(k,v):xs]\r
-       | k == key\r
-               = (v, [(k, value):xs])\r
-               #! (old_val, xs) = updateAssocList key value default_val xs\r
-               = (old_val, [(k, v) : xs]) \r
-       \r
-derive bimap FMap, Maybe\r
-bimap{|{}|} bma = {map_to = mapArray bma.map_to, map_from = mapArray bma.map_from}\r
-\r
-generic gLookupFMap key :: key (FMap value) -> FMap value\r
-gLookupFMap{|Char|} key (FMChar xs) = lookupAssocList key FMEmpty xs\r
-gLookupFMap{|Char|} key FMEmpty        = FMEmpty\r
-\r
-gLookupFMap{|Int|} key (FMInt xs) = lookupAssocList key FMEmpty xs\r
-gLookupFMap{|Int|} key FMEmpty         = FMEmpty\r
-\r
-gLookupFMap{|Real|} key (FMReal xs) = lookupAssocList key FMEmpty xs\r
-gLookupFMap{|Real|} key FMEmpty        = FMEmpty\r
-\r
-gLookupFMap{|Bool|} False (FMEither ls rs)     = ls\r
-gLookupFMap{|Bool|} True  (FMEither ls rs)     = rs\r
-gLookupFMap{|Bool|} key FMEmpty                        = FMEmpty\r
-\r
-//gLookupFMap{|UNIT|} key (FMValue v)  = (FMValue v)\r
-//gLookupFMap{|UNIT|} key FMEmpty              = FMEmpty\r
-gLookupFMap{|UNIT|} key fm             = fm\r
-\r
-gLookupFMap{|PAIR|} fx fy (PAIR kx ky) fm = fy ky (fx kx fm)\r
-\r
-gLookupFMap{|EITHER|} fl fr (LEFT key) (FMEither ls rs) = fl key ls\r
-gLookupFMap{|EITHER|} fl fr (RIGHT key) (FMEither ls rs) = fr key rs\r
-gLookupFMap{|EITHER|} fl fr key FMEmpty        = FMEmpty \r
-\r
-gLookupFMap{|CONS|} f (CONS key) fm = f key fm\r
-gLookupFMap{|FIELD|} f (FIELD key) fm = f key fm\r
-gLookupFMap{|OBJECT|} f (OBJECT key) fm = f key fm\r
-\r
-derive gLookupFMap []\r
-\r
-gLookupFMap{|String|} arr fm = gLookupFMap{|*|} [x\\x<-:arr] fm\r
-gLookupFMap{|{}|} f arr fm = gLookupFMap{|*->*|} f [x\\x<-:arr] fm\r
-gLookupFMap{|{!}|} f arr fm = gLookupFMap{|*->*|} f [x\\x<-:arr] fm\r
-\r
-derive gLookupFMap (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)\r
-\r
-lookupFMap :: !k .(FMap v) -> .(Maybe v) | gLookupFMap{|*|} k & bimap{|*|} v\r
-lookupFMap key fmap = case gLookupFMap{|*|} key fmap of\r
-       FMValue v       -> Just v\r
-       FMEmpty         -> Nothing \r
-       _                       -> abort "erroneous FMap"\r
-\r
-\r
-//------------------------------------------------------------------------------------\r
-\r
-generic gInsertFMap key :: key (FMap value, FMap value) -> (FMap value, FMap value)\r
-\r
-gInsertFMap{|Char|} key (new_val, FMChar xs) \r
-       # (old_val, xs) = updateAssocList key new_val FMEmpty xs\r
-       = (old_val, FMChar xs)\r
-gInsertFMap{|Char|} key (new_val, FMEmpty)     \r
-       = (FMEmpty, FMChar [(key, new_val)])\r
-\r
-gInsertFMap{|Int|} key (new_val, FMInt xs) \r
-       # (old_val, xs) = updateAssocList key new_val FMEmpty xs\r
-       = (old_val, FMInt xs)\r
-gInsertFMap{|Int|} key (new_val, FMEmpty)      \r
-       = (FMEmpty, FMInt [(key, new_val)])\r
-\r
-gInsertFMap{|Real|} key (new_val, FMReal xs) \r
-       # (old_val, xs) = updateAssocList key new_val FMEmpty xs\r
-       = (old_val, FMReal xs)\r
-gInsertFMap{|Real|} key (new_val, FMEmpty)     \r
-       = (FMEmpty, FMReal [(key, new_val)])\r
-\r
-gInsertFMap{|Bool|} False (v, FMEither ls rs)  = (ls, FMEither v rs)\r
-gInsertFMap{|Bool|} False (v, FMEmpty)                         = (FMEmpty, FMEither v FMEmpty)\r
-gInsertFMap{|Bool|} True  (v, FMEither ls rs)  = (rs, FMEither ls v)\r
-gInsertFMap{|Bool|} True  (v, FMEmpty)                 = (FMEmpty, FMEither FMEmpty v)\r
-       \r
-gInsertFMap{|UNIT|} key (x, y)                 = (y, x)\r
-\r
-gInsertFMap{|PAIR|} fx fy (PAIR kx ky) (new_val, fmx) \r
-       #! (old_fmy, fmx1) = fx kx (FMEmpty, fmx)\r
-       #! (old_val, new_fmy) = fy ky (new_val, old_fmy)   \r
-       #! (empty_fmy, new_fmx) = fx kx (new_fmy, fmx) \r
-       = (old_val, new_fmx)\r
-\r
-gInsertFMap{|EITHER|} fl fr (LEFT key) (v, FMEither ls rs) \r
-       # (old_val, new_ls) = fl key (v,ls)\r
-       = (old_val, FMEither new_ls rs)\r
-gInsertFMap{|EITHER|} fl fr (LEFT key) (v, FMEmpty)\r
-       # (old_val, new_ls) = fl key (v,FMEmpty)\r
-       = (FMEmpty, FMEither new_ls FMEmpty)\r
-gInsertFMap{|EITHER|} fl fr (RIGHT key) (v, FMEither ls rs)\r
-       # (old_val, new_rs) = fr key (v,rs)\r
-       = (old_val, FMEither ls new_rs)\r
-gInsertFMap{|EITHER|} fl fr (RIGHT key) (v, FMEmpty)\r
-       # (old_val, new_rs) = fr key (v,FMEmpty)\r
-       = (FMEmpty, FMEither FMEmpty new_rs)\r
-       \r
-gInsertFMap{|CONS|} f (CONS key) x = f key x\r
-gInsertFMap{|FIELD|} f (FIELD key) x = f key x\r
-gInsertFMap{|OBJECT|} f (OBJECT key) x = f key x\r
-\r
-derive gInsertFMap []\r
-\r
-gInsertFMap{|String|} xs fm = gInsertFMap{|*|} [x\\x<-:xs] fm\r
-gInsertFMap{|{}|} f xs fm = gInsertFMap{|*->*|} f [x\\x<-:xs] fm\r
-gInsertFMap{|{!}|} f xs fm = gInsertFMap{|*->*|} f [x\\x<-:xs] fm\r
-\r
-derive gInsertFMap (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)\r
-\r
-(<<=) infixl 1 :: .(FMap v) !.(k,v) -> FMap v | gInsertFMap{|*|} k & bimap{|*|} v\r
-(<<=) fmap (key, value)\r
-       #! (old_val, fmap) = gInsertFMap{|*|} key (FMValue value, fmap)\r
-       = fmap \r
-\r
-//-----------------------------------------------------------------------------\r
-/* \r
-fmap = FMEmpty \r
-       <<= ("one", 1)\r
-       <<= ("two", 2)\r
-       <<= ("three", 3)\r
-       <<= ("four", 4)\r
-\r
-Start = lookupFMap "two" fmap \r
-*/\r